Frage

sagen, wir haben dieses Szenario:

Artist ==< Album ==< Track
//ie, One Artist can have many albums, and one album can have many tracks

In diesem Fall werden alle drei Einheiten haben grundsätzlich die gleichen Felder:

  • ID
  • Name
  • Ein Fremd der Ein-Beziehung zu den entsprechenden Kindern (Artist Album und Album Track

Eine typische Lösung für die bereitgestellte Lösung würde drei Tabellen mit den gleichen Bereichen (ArtistID, ALBUMID etc ...) und für Fremdschlüssel in der one-Beziehung Feld sein.

Aber wir können in diesem Fall beinhalten eine Form der Vererbung die Wiederholung des gleichen Feldes zu vermeiden? Ich spreche etwas Derartiges:

Table: EntityType(EntityTypeID, EntityName)
       This table would hold 3 entities (1. Artist, 2. Album, 3. Track)

Table: Entities(EntityID, Name, RelField, EntityTypeID)
       This table will hold the name of the entity (like the name of 
       an artist for example), the one-many field (foreign-key
       of EntityID) and EntityTypeID holding 1 for Artist, 2 for Album 
       and so on. 

Was denken Sie über das oben genannte Design? Ist es sinnvoll „OOP-Konzepte“ in diesem DB-Szenario zu integrieren?

Und schließlich würden Sie es vorziehen, die Fremdschlüssel-Constraints des ersten Szenario haben oder den allgemeineren (mit dem Risiko, einen Künstler mit einer Spur zum Beispiel die Verknüpfung, da es keine Kontrolle ist die Eingabeeinrichtung Fremdschlüsselwert zu sehen, ist wirklich ein Album) Ansatz?

.. btw kommen, daran zu denken, ich denke, man kann tatsächlich überprüfen, ob ein eingegebene Wert des RelField eines Künstlers entspricht ein Album, mit Triggern vielleicht?

War es hilfreich?

Lösung

Ich habe vor kurzem diese Idee der Abstraktion consistenly, und die Anwendung und die Datenbank wurde ein Monster Wartung und Fehlerbehebung implementiert gesehen. Ich werde von dieser Technik bleiben weg. Je einfacher, desto besser, ist mein Mantra.

Andere Tipps

Es gibt kaum eine Chance, dass die zusätzlichen Felder, die unweigerlich auf den verschiedenen Einheiten ansammeln werden als verbindlich sein. Nichts gewonnen werden, indem man die Realität nicht in einer einigermaßen nahe Art und Weise widerspiegelt.

Ich glaube nicht, Sie würden auch wahrscheinlich diese Entitäten in Ihrem normalen OO-Design verschmelzen.

Das erinnert mich (aber nur geringfügig) von einem Versuch, ich einmal sah alles in einer einzigen Tabelle (mit dem Namen „Entity“) mit einer anderen Tabelle (mit dem Namen „Attribute“) und eine Verknüpfungstabelle zwischen ihnen zu implementieren.

alle zusammen drei von stucking, machen Sie Ihre Anfragen weniger readble (es sei denn, Sie dann die drei Kategorien Ansichten zersetzen), und Sie machen die Suche und Indizierung schwieriger.

Plus, an einem gewissen Punkt werden Sie Attribute zu einer Kategorie hinzufügen möchten, die keine Attribute für die anderen sind. gibt Ihnen zusammen keinen Raum für Veränderung alle drei Festhalten ohne Klumpen Ihres Systems herauszureißen.

Seien Sie nicht so klug erhalten Sie stolpern Sie sich.

Der einzige Vorteil sehe ich es in Ihrer OOP Art und Weise zu tun ist, wenn es andere Elementtypen in Zukunft hinzugefügt werden (das heißt, anders als Interpret, Album und Titel). In diesem Fall würden Sie eine Schemaänderung nicht benötigen.

Allerdings würde ich neige dazu, für die nicht-OOP Art und Weise zu entscheiden und nur das Schema in diesem Fall ändern. Einige Probleme, die Sie mit der OOP-Lösung haben, sind:

  • was ist, wenn Sie den Geburtstag von Künstlern hinzufügen?
  • was ist, wenn Sie wollen Dauer von Alben und Titel speichern?
  • was ist, wenn der Mangel Spurtyp zu speichern?

Im Grunde genommen, was ist, wenn Sie wollen etwas speichern, die psecific ist nur auf einem oder zwei der Elementtypen?

Wenn Sie in dieser Art der Sache sind, dann nehmen Sie einen Blick auf Tabelle Vererbung in PostgreSQL .

create table Artist (id integer not null primary key, name varchar(50));
create table Album (parent integer foreign key (id) references Artist) inherits (Artist);
create table Track (parent integer foreign key (id) references Album) inherits (Artist);

ich mit le dorfier einverstanden sind, Sie könnten einige Wiederverwendung aus dem Begriff einer Basiseinheit (ID, Name) erhalten, aber über diesen Punkt hinaus die Konzepte der Künstler, Album und Track-divergieren.

Und ein realistischeres Modell würde wahrscheinlich mit der Tatsache zu tun hat, dass mehrere Künstler zu einer einzigen Spur auf einem Album beitragen können ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top