Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL:Normalisierung der Datenbank unter Beibehaltung von Einschränkungen

Sie implementieren den Entity-Attribute-Value Antimuster. Dies kann kein normalisiertes Datenbankdesign sein, da es nicht relational ist.

Was ich stattdessen vorschlagen würde, ist die Klassentabellenvererbung Entwurfsmuster:

  • Erstellen Sie eine Tabelle für Organismen, die Eigenschaften enthält, die allen Arten gemeinsam sind.
  • Erstellen Sie eine Tabelle pro Art, die Eigenschaften enthält, die für diese Art spezifisch sind. Jede dieser Tabellen hat eine 1-zu-1-Beziehung zu Organismen, aber jede Eigenschaft gehört in eine eigene Spalte.

     ____________________             ____________________
    |     Organisms      |           |       Species      |
    |--------------------|           |--------------------|
    |OrganismId (int, PK)|           |SpeciesId (int, PK) |
    |SpeciesId (int, FK) |∞---------1|Name (varchar)      |
    |Name (varchar)      |           |____________________|
    |____________________|
              1
              |
              |
              1
     ______________________ 
    |    HumanOrganism     |
    |----------------------|
    |OrganismId (int, FK)  |
    |Sex      (enum)       |
    |Race     (int, FK)    |
    |EyeColor (int, FK)    |
    |....                  |
    |______________________|
    

Das bedeutet zwar, dass Sie viele Tabellen erstellen werden, aber betrachten Sie dies als Kompromiss mit den vielen praktischen Vorteilen, Eigenschaften relational richtig zu speichern:

  • Sie können SQL-Datentypen entsprechend verwenden, anstatt alles als Freiform-Varchar zu behandeln.
  • Sie können Einschränkungen oder Nachschlagetabellen verwenden, um bestimmte Eigenschaften durch einen vordefinierten Satz von Werten einzuschränken.
  • Sie können Eigenschaften obligatorisch machen (d. h. NICHT NULL) oder andere Einschränkungen verwenden.
  • Daten und Indizes werden effizienter gespeichert.
  • Abfragen sind für Sie einfacher zu schreiben und für das RDBMS einfacher auszuführen.

Weitere Informationen zu diesem Design finden Sie in Martin Fowlers Buch Patterns of Enterprise Application Architecture , oder meine Präsentation Praktische objektorientierte Modelle in SQL , oder mein Buch, SQL Antipatterns:Avoiding the Pitfalls of Database Programming .