2016-12-06 4 views
2

Ich möchte Folgendes tun:Postgres nicht eindeutig, wenn anderes Feld gleich ist, sonst einzigartig?

Erstellen Sie eine Einschränkung, wo ein Benutzer eine eindeutige URL beanspruchen kann, und sie können so viele Zeilen mit dieser URL erstellen, wie sie wollen, aber andere Benutzer können diese URL nicht verwenden, sobald sie es ist wurde einmal erstellt.

Wer weiß, wie ich das machen würde? Vielen Dank!

Antwort

2

Sie möchten, dass eine URL für einen Benutzer eindeutig ist, danach jedoch nicht mehr eindeutig ist.

Wenn Sie jede URL für einen Benutzer aufgelistet haben, können Sie dies mit einem gefilterten/partiellen Index tun.

create unique index idx_t_user_url_seqnum on t(user, url, seqnum) 
    where seqnum = 1; 

Aber ich denke, das Problem ist Ihr Datenmodell. Sie versuchen, mit einer einzigen Tabelle zu viel zu tun. Ich denke, Sie sollten mit Zuordnungen zwischen URLs und Benutzern eine Zuordnungstabelle haben:

create table UserUrlMapping (
    UserUrlMappingId serial primary key, 
    UserId int references Users(UserId), 
    Url varchar(4000) 
    constraint unq_url unique (Url) -- If you think about it, being in this table once means that there is only one user 
); 

Dann in Ihrer Datentabelle, nicht die URL setzen dort stattdessen die UserUrlMappingId setzen.

+0

danke für Ihre Antwort! Würde die eindeutige URL-Einschränkung nicht bedeuten, dass der Benutzer nur eine Zeile erstellen kann? oder vielleicht missverstehe ich – Matt

+0

@Matt. . . In der Mapping-Tabelle gäbe es nur einen Eintrag pro Benutzer und URL. Eine Zeile in dieser Tabelle kann beliebig oft von Ihrer Tabelle aus referenziert werden. –

1

Zuerst eine Tabelle erstellen, die URLs mit Benutzern zuordnet:

CREATE TABLE url_allocations (
    url  text NOT NULL, 
    user_id uuid NOT NULL, 
    PRIMARY KEY (url), 
    FOREIGN KEY (user_id) 
     REFERENCES users(id) 
     ON DELETE CASCADE 
); 

Jetzt jede URL können nur von nur einem Benutzer verwendet werden, aufgrund der Primärschlüsselbedingung. Als nächstes einen Fremdschlüssel auf den Tisch erstellen:

CREATE TABLE links (
    id  uuid NOT NULL, 
    url  text NOT NULL, 
    -- ... 
    PRIMARY KEY (id), 
    FOREIGN KEY (url) 
     REFERENCES url_allocations(url) 
     ON DELETE RESTRICT 
); 

Die Benutzer-ID des Link jetzt durch den Beitritt url_allocations gefunden werden kann.

+0

danke für Ihre Antwort! vielleicht verstehe ich die Tabellennamen nicht, aber würde es 3 Tabellen geben? url_allocations, links, & benutzer? – Matt

+0

@Matt ja, aber ich nehme an, Sie hatten bereits 'Benutzer' und' Links' – rightfold

Verwandte Themen