Próbuję utworzyć bazę danych dla mojej aplikacji i jedną rzeczą, którą chciałbym znaleźć najlepszym sposobem na zrobienie, jest utworzenie relacji jeden do wielu między moimi Users
a Items
tabelami.
Wiem, że mogę zrobić trzecią tabelę ReviewedItems
i mają kolumny być User
id i Item
id, ale chciałbym wiedzieć, czy to możliwe, aby kolumny w Users
, powiedzmy reviewedItems
, która jest tablicą całkowitą zawierający klucze obce na Items
które User
dokonała przeglądu.
Jeśli PostgreSQL może to zrobić, daj mi znać! Jeśli nie, po prostu zejdę po mojej trzeciej trasie tabeli.
Odpowiedzi:
Nie, to niemożliwe.
PostgreSQL to relacyjny DBMS, działający najskuteczniej na odpowiednio znormalizowanych modelach danych. Tablice to - z definicji są to uporządkowane zbiory - nie relacyjne struktury danych, dlatego standard SQL nie obsługuje definiowania kluczy obcych w elementach tablic, podobnie jak PostgreSQL.
Możesz jednak zbudować doskonałą bazę danych z elementami tablic łączącymi się z kluczami podstawowymi w innych tabelach. Jednak te elementy tablicy nie mogą być zadeklarowane jako klucze obce i dlatego DBMS nie będzie zachowywał integralności referencyjnej.
źródło
reliably in all cases
? Masz na myśli, że czasami wyzwalacz może się nie udać? Dzięki.Wkrótce będzie to możliwe: https://commitfest.postgresql.org/17/1252/ - Mark Rofail wykonał świetną robotę nad tą poprawką!
Łatka pozwoli (po zakończeniu)
CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text ); CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
Jednak autor potrzebuje obecnie pomocy w przebudowaniu łatki (poza moimi własnymi możliwościami), więc każdy, kto to czyta, kto zna wewnętrzne elementy Postgresa, powinien pomóc, jeśli możesz.
źródło
CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int )