Her biri yabancı anahtar olan PostgreSQL dizi elemanları


89

Uygulamam için bir DB oluşturmaya çalışıyorum ve yapmanın en iyi yolunu bulmak istediğim bir şey, benim Usersve Itemstablolarım arasında bire çok ilişkisi oluşturmaktır .

Ben, üçüncü bir tablo yapabilir biliyorum ReviewedItems, ve sütunlar bir olmak zorunda Userkimliği ve Itemkimliği, ancak bir sütun yapmak mümkün mü bilmek istiyorum Usersdiyelim, reviewedItemsyabancı anahtarlar içeren bir tamsayı dizisi olan Itemso Usertarafından incelendi.

PostgreSQL bunu yapabiliyorsa, lütfen bana bildirin! Değilse, üçüncü masa rotamdan aşağı inerim.


3
Bu özelliği Postgres'e eklemek için yamalar olmuştur, bkz. Blog.2ndquadrant.com/… (2012) ve postgresql.org/message-id/… (2017). Henüz kabul edilmediler, ama umarım bir gün.
Simon Kissane

Yanıtlar:


71

Hayır, bu mümkün değil.

PostgreSQL, uygun şekilde normalleştirilmiş veri modellerinde en verimli şekilde çalışan ilişkisel bir DBMS'dir. Diziler - tanım gereği sıralı kümelerdir - ilişkisel veri yapıları değildir ve bu nedenle SQL standardı yabancı anahtarların dizi elemanlarında tanımlanmasını desteklemez ve PostgreSQL de desteklemez.

Bununla birlikte, diğer tablolardaki birincil anahtarlara bağlanan dizi öğeleriyle mükemmel bir veritabanı oluşturabilirsiniz. Ancak bu dizi öğeleri yabancı anahtarlar olarak bildirilemez ve bu nedenle DBMS bilgi tutarlılığını korumaz.


3
Sen edebilirsiniz kontrol edecek bir kısıt tetiği tanımlar. Ancak her durumda güvenilir bir şekilde çalışıp çalışmadığından emin değilim.
a_horse_with_no_name

@a_horse_with_no_name: hakkında bir örnek verebilir misiniz reliably in all cases? Yani bazen tetikleyici başarısız olabilir mi? Teşekkürler.
Luan Huynh

1
@LuanHuynh: (Teknik) ayrıntıları hatırlamıyorum, ancak bu son kez posta listesinde tartışıldığında, biri karşılık gelen bir kısıtlama tetikleyicisinin tüm vakaları yakalayamayabileceğinden bahsetti - ancak bu artık doğru olmayabilir
a_horse_with_no_name

Teşekkürler, sanırım onlar için bir ilişki tablosu yapacağım
Zach

1
@a_horse_with_no_name böyle bir kısıtlama örneği ile bir cevap gönderebilir misiniz?
OrangeDog

69

Yakında bunu yapmak mümkün olabilir: https://commitfest.postgresql.org/17/1252/ - Mark Rofail bu yama üzerinde harika işler yapıyor!

Yama (tamamlandığında) izin verecektir

CREATE TABLE PKTABLEFORARRAY (
    ptest1 float8 PRIMARY KEY,
    ptest2 text
);
CREATE TABLE FKTABLEFORARRAY (
    ftest1 int[],
    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY,
    ftest2 int
);

Bununla birlikte, yazarın yamayı yeniden düzenlemek için şu anda yardıma ihtiyacı var (benim yeteneğimin ötesinde), bu nedenle bunu okuyan ve Postgres iç işlerini bilen herkes lütfen yardım edin.


8
gerçekten çok SICAK ...CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int )
Victor

1
Yama, yazarın takip etmesini bekliyor. Özellik kullanıma sunulana kadar, yavaş olabilecek bütünlüğü kontrol etmek için tetikleyici kullanmanız gerekecektir.
yoonghm

36
utanç, :( dahil edilmiştir görünüyor gelmez
Teocali

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.