2016-05-08 15 views
0

Hier ist mein Datenmodell.Erstellen Sie eine eindeutige Integritätsregel für zwei Spalten in zwei Tabellen

data-model

Ich brauche die username Spalte in der Tabelle USER als eindeutige Spalte zu machen. Aber es sollte mit der Firma einzigartig sein.

Zum Beispiel Firma A kann einen Benutzernamen haben als James und Firma B auch einen Benutzernamen als James haben.

Um dies zu erreichen, ist meiner Meinung nach eine unique constraint mit username und company_id zu machen.

Wie kann ich das tun?

Antwort

1

Sie müssen Ihre Datenbank ändern, indem Sie den Benutzern company_id hinzufügen. Fügen Sie dann einen eindeutigen Index (company_id, username) zu Ihrer Tabelle hinzu.

user 
---- 
user_id  (PK) 
company_id (UNIQUE INDEX) 
emplyee_id 
email 
username (UNIQUE INDEX) 
password 

aber ich denke, Sie nicht ein viele müssen viele Beziehung, eine gute Idee sein könnte Ihre Datenbank zu entfernen, die viele zu viele Reaktion auf diese Art und Weise zu ändern:

company 
------- 
company_id (PK) 
company_name 

user 
---- 
user_id  (PK) 
company_id 
emplyee_id 
email 
username 
password 
+0

Danke Danilo. Wird sich diese Änderung auf die Normalisierung der Datenbank auswirken? – Bishan

+0

Ich denke, dass diese Änderung vor der Normalisierung ist, ich schlage vor, das Entity-Relationsmodell zu ändern und eine Einschränkung hinzuzufügen: Ein Benutzer kann nur in einer Firma arbeiten. –

1

Aus den Daten Modell, ist es klar, dass ein Benutzer zu mehreren Firmen gehören kann und eine Firma mehrere Benutzer haben kann. Das Hinzufügen von company_id zur Tabelle USER führt dazu, dass die USER-Tabelle mit vielen redundanten Benutzerdaten für jede Firmeninstanz explodiert. Die Entität USER_COMPANY existiert speziell, um dies zu vermeiden.

Es ist nicht ratsam, diese Anforderung mit Datenmodelländerungen zu behandeln. Der beste Weg, um diese Anforderung zu erfüllen, ist durch Anwendungscode oder Trigger.

Der am wenigsten ineffiziente Weg, dies durch Datenmodelländerungen zu erreichen, ist das Hinzufügen der Spalte Benutzername in der Tabelle user_company und das Synchronisieren der Tabelle user und user_company für die Spalte user_name über alle DMLs in der Anwendung. Das erfordert wiederum viel Anwendungscode.

Also die beste Lösung ist es, es der Anwendung zu überlassen und ein gutes Datenmodell nicht zu stören.

Hoffe, das hilft.