2013-06-11 3 views

Antwort

8

Fügen Sie in Map einen Fremdschlüssel hinzu, der auf den Primärschlüssel des Bereichs verweist. Dadurch wird eine Eins-zu-viele-Beziehung zwischen Karten und Bereichen erzwungen.

Für die Durchsetzung eines Minimum von einer Karte pro Bereich (wenn das notwendig ist) gibt es einige Ideen in diesem Beitrag here. Eine der einfacheren Lösungen wäre eine Ansicht zu erstellen, die nur die Bereiche zeigt, die Karten haben:

CREATE VIEW viewAreas AS 
SELECT * 
FROM Areas, Maps 
WHERE Areas.ID = Maps.AreaID; 

Auf diese Weise können Sie einen Bereich erstellen, und fügen Sie dann Karten zu. Sie können den Fremdschlüssel in Karten auch als NOT NULL festlegen, sodass eine Karte immer einen Bereich aufweisen muss.

+0

Meiner Meinung nach ist die Trigger-Lösung, die danach eingestellt wird, am besten geeignet. Danke für deine Antwort! – tellob

2

Jeweils eine Tabelle für Map und Area, mit einem Fremdschlüssel auf der Karte, die mit Area verknüpft ist.

+0

Das bedeutet, dass ich eine Area ID in meiner Map-Tabelle habe? – tellob

+0

@tellob: Ja, genau. –

+0

Aber stellt dies nicht nur sicher, dass eine Karte eine Fläche hat? Wie ist es sicher, dass ein Gebiet auch eine Karte hat, wenn es erstellt wird? – tellob

11
create table Area(id int primary key auto_increment, name varchar(100)); 

create table Map(id int primary key auto_increment, 
       area_id int not null, 
       name varchar(100), 
       foreign key (area_id) references area(id)); 

SqlFiddle

Jeder Map muss ein Area haben, als area_id nicht null ist (und ist ein Foreign key auf Area)

Aber Sie werden nicht in der Lage sein (und es ist nicht erwünscht) zu habe für jeden Bereich "mindestens eine Karte".

Eines Tages müssen Sie ein Area erstellen. Und es wird zu dieser Zeit keine Map haben. Oder machen Sie "regelmäßige" Überprüfungen, um die Bereiche ohne Karte zu sehen.

Sie können ein Area löschen, wenn es keine verwandten Map mehr hat, wenn Sie eine Map löschen.

+0

Also: Ich kann kein Ding wie bauen: Ein Bereich muss eine Karte haben? Ich kann nur sicherstellen, dass eine Karte bisher eine Fläche hat? – tellob

+0

@tellob. Ja. Zumindest auf der db-Ebene. Sie könnten diese Art der Prüfung eher auf Anwendungsebene verwalten. –

+1

Ich weiß, woher du kommst, aber ich bin mir nicht sicher, ob ich dem zustimme. Dieses Argument führt, wenn es für alle Elemente befolgt wird, dazu, dass keine Auslandsbeziehung erforderlich ist. Ich denke, es ist besser, es zu verlangen und mit der Arbeit umzugehen, z. Erstellen Sie zuerst das Kind, dann das Elternelement und weisen Sie das Kind an diesem Punkt zu. Validierungen zu vermeiden, weil "eines Tages" ein leerer Datensatz benötigt wird, hat in der Vergangenheit nicht so gut funktioniert. –