sql >> Database teknologi >  >> RDS >> Sqlserver

SQL:Normalisering af databasen med bibeholdelse af begrænsninger

Du er ved at implementere Entity-Attribute-Value antimønster. Dette kan ikke være et normaliseret databasedesign, fordi det ikke er relationelt.

Det, jeg vil foreslå i stedet, er Klassebordsarv designmønster:

  • Opret én tabel for organismer, der indeholder egenskaber, der er fælles for alle arter.
  • Opret én tabel pr. art, der indeholder egenskaber, der er specifikke for den pågældende art. Hver af disse tabeller har et 1-til-1 forhold til organismer, men hver egenskab hører til i sin egen kolonne.

    ____________________ ____________________ | 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) | |.... | |______________________|

Det betyder, at du vil oprette mange tabeller, men betragte dette som en afvejning med de mange praktiske fordele ved at opbevare egenskaber på en relationelt korrekt måde:

  • Du kan bruge SQL-datatyper på passende måde i stedet for at behandle alt som frit varchar.
  • Du kan bruge begrænsninger eller opslagstabeller til at begrænse visse egenskaber med et foruddefineret sæt værdier.
  • Du kan gøre egenskaber obligatoriske (dvs. IKKE NULL) eller bruge andre begrænsninger.
  • Data og indekser gemmes mere effektivt.
  • Forespørgsler er nemmere for dig at skrive og nemmere for RDBMS at udføre.

For mere om dette design, se Martin Fowlers bog Patterns of Enterprise Application Architecture , eller min præsentation Praktiske objektorienterede modeller i SQL , eller min bog, SQL Antipatterns:Avoiding the Pitfalls of Database Programming .



  1. Markører med postgres, hvor er dataene gemt og hvor mange opkald til DB'en

  2. Hvordan ser du ALT tekst fra en ntext eller nvarchar(max) i SSMS?

  3. Slet aldrig poster? God ide? Sædvanlig?

  4. PostgreSQL dynamisk tabeladgang