Frage

Szenario

Ich habe 3 Datenbanktabellen. Eines ist für Bilder und die anderen beiden sind Menschen und Orte. Da jede Person viele Bilder und jeder Ort kann viele Bilder machen können, möchte ich zwischen den beiden Menschen und Bilder, die eine one to many Beziehung haben, sowie Orte und Bilder.

Frage

Ist der Fremdschlüssel hat die gleichen Namen wie der Primärschlüssel genannt werden? Oder ist es mir möglich, die Fremdschlüssel in der Tabelle Bilder etwas zu nennen generic, zum Beispiel „PKTableID“. Auf diese Weise brauche ich nur ein Bild Tabelle.

Hilfe sehr geschätzt.

Grüße,

EDIT:

Der Grund für den Wunsch, nur ein einziges Bild Tisch haben, ist, weil jedes Bild auf eine einzige andere Tabelle lediglich verweist. Neben dieser, habe ich das Beispiel hier von zwei Tabellen, die tatsächlich Datenbank I 20 Tabellen müssen nicht verwenden, so wollte ich wissen, ob es noch möglich war, ein einzelnes Bild TABELLE FÜR 20 eine Eins-zu-Viele-Beziehungen zu verwenden ?

War es hilfreich?

Lösung

EDIT

Wenn ein Bild immer nur von einem der zwanzig Tabellen gehört, dieser Entwurf könnte funktionieren:

People (PersonId, Name)
Places (PlaceId, Name)
Dogs (DogId, Breed)
Doors (DoorId, Height, Width)
Images (ImageId, ImageBinary, OwnerId, OwnerTable)

Wo OwnerTable ist der Name oder der Code für die Tabelle, die ownerID gehört.

Dies würde 20 FKs in der Bildtabelle oder 20 Zuordnungstabellen speichern. Dann wird in dem beitritt, würden Sie OwnerTable angeben, abhängig von der Tabelle, die Sie beitreten.

Sie müssten konvertierbar Typen für die Ids (zB TINYINT, SMALLINT und INT) verwenden, und vorzugsweise ein Typ für alle (zB INT), und Sie würden sich referentielle Integrität obwohl Trigger verwalten müssen oder eine andere Code.

/ EDIT

Sie müssen 5 Tabellen, nicht 3:

People (PersonId, Name)
Places (PlaceId, Name)
Images (ImageId, ImageBinary)
ImagesPeople (ImageId, PersonId)
ImagesPlaces (ImageId, PlaceId)

Sie können die Felder nennen, wie Sie wollen. People.Id, ImagesPeople.PersonId, etc.

Aber was kann man nicht tun, ist so etwas wie folgt aus:

People (PersonId, Name)
Places (PlaceId, Name)
Images (ImageId, ImageBinary, PlaceOrPersonId)

Nun, können Sie, aber die Datenbank finden Sie die Beziehung nicht helfen zu erzwingen, oder sagen Ihnen, welche Tabelle der FK gehört. Wie würdest du wissen? Es gibt hackish Umgehungen wie die ID-Schritte Staffelung, eine Art Spalte Bilder hinzufügen oder mit GUIDs.

Alternativ:

Things (ThingId PK, Type)
People (ThingId PK/FK, Name, Age)
Places (ThingId PK/FK, Name, LatLon)
Images (ImageId PK, ImageBinary, ThingId FK)

Sie können auch ein „Ding“ machen Bilder. Manchmal sieht man Entwürfe so. Es gibt Ihnen die referentielle Integrität, aber nicht Exklusivität geben. Sie könnten das gleiche ThingID in Menschen, Orte und Bilder haben, und die Datenbank würde sich nicht darum. Sie würden zu Code, der sich selbst regieren.

Edit: bei Cylon Cat Vorschlag, Szenario 4:

People (PersonId, Name)
Places (PlaceId, Name)
PeopleImages (PeopleImageId, ImageBinary)
PlaceImages (PlaceImageId, ImageBinary)

Hier werden die Bilder ausschließlich von einer Person oder ein Ort im Besitz. Ähnlich wie bei der Version 2, aber mit deklarierten Fremdschlüssel. Es kann einige Leistungsvorteile gegen die 5 Tabellen-Design haben, da weniger benötigt verbindet. Sie verlieren „Bild“ als eigenständige Einheit, ersetzt durch „PeopleImage“ und „PlaceImage“.

Andere Tipps

Wie Peter wies darauf hin, Sie wirklich eine viele zu viele Beziehung brauchen, wenn Sie sich mit Ihren Bildern auf Bilder einschränken wollen nur eine Person, auch ein guter Ort Index wird die hierarchische Natur von Ortsnamen widerspiegeln (Montmartre, Paris, Frankreich = drei mögliche Namen für einen Ort).

Nun technisch können Sie Ihre Indizes und Tabellen etwas aufrufen, die kein reserviertes Wort ist und wurde bereits nicht verwendet, X, Y, Z12345 und WOBBLY sind alle gültigen Namen für einen Index.

In der Praxis jedoch seine besten eine Namenskonvention zu folgen, die zu den Punkten was gespeichert und wofür. So Tabellen PEOPLE_X_IMAGES und ein PLACES_X_IMAGES wäre eine gute Idee, in Ihrem Fall sein. Sie müssen nicht wirklich etwas über Menschen oder Orte in der eigentlichen Bilder Tabelle. Ebenso müssen Sie nicht etwas über Bilder in den Menschen brauchen und Orte Tabellen.

könnten Sie fügen theoretisch zwei Fremdschlüssel auf die Bilder Tabelle hinzufügen, eine für Menschen und eine für Orte. Dann könnten Sie nulls ermöglichen und für die entsprechenden Spalten verbinden, wenn eine Abfrage ausgeführt wird. Das ist nicht viel von einer Lösung aber, weil was macht diese Tabelle aussehen, wenn Sie 14 Tabellen, die mit ihm verbinden müssen?

Wenn Sie nicht GUIDs nicht benutzen wollen, dann sage ich Ihnen, es so many-to-many aufgebaut aus Gründen des nächsten Kerl, der es zu verstehen hat.

Sie können eine Tabelle verwenden, aber Sie würden zwanzig verschiedene Felder für die Beziehungen brauchen. Wenn Sie eine Fremdschlüsselbeziehung einrichten, dann müssen alle Daten auf der übergeordneten Tabelle beziehen, können Sie nicht zwei Fremdschlüsselbeziehungen in einer Tabelle gespeichert werden können. So müssen Sie eine Spalte einrichten für jede fk Sie haben wollen.

Wie wäre es

Person (PersonId PK, Name, ImageId FK)
Image (ImageId PK, Name)
Place (PlaceId PK, Name, ImageId FK)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top