sql >> Database >  >> RDS >> Sqlserver

SQL:Normalisatie van database met behoud van beperkingen

U implementeert de Entity-Attribute-Value antipatroon. Dit kan geen genormaliseerd databaseontwerp zijn, omdat het niet relationeel is.

Wat ik in plaats daarvan zou willen voorstellen is de Class Table Inheritance ontwerppatroon:

  • Maak één tabel voor organismen, met eigenschappen die alle soorten gemeen hebben.
  • Maak per soort één tabel met eigenschappen die specifiek zijn voor die soort. Elk van deze tabellen heeft een 1-op-1 relatie met Organismen, maar elke eigenschap hoort thuis in zijn eigen kolom.

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

Dit betekent dat u veel tabellen zult maken, maar beschouw dit als een afweging met de vele praktische voordelen om eigenschappen op een relationeel correcte manier op te slaan:

  • Je kunt SQL-gegevenstypen op de juiste manier gebruiken, in plaats van alles als een vrije vorm varchar te behandelen.
  • U kunt beperkingen of opzoektabellen gebruiken om bepaalde eigenschappen te beperken met een vooraf gedefinieerde set waarden.
  • U kunt eigenschappen verplicht maken (d.w.z. NIET NULL) of andere beperkingen gebruiken.
  • Gegevens en indexen worden efficiënter opgeslagen.
  • Query's zijn gemakkelijker voor u om te schrijven en gemakkelijker voor het RDBMS om uit te voeren.

Zie voor meer informatie over dit ontwerp het boek van Martin Fowler Patterns of Enterprise Application Architecture , of mijn presentatie Praktische objectgeoriënteerde modellen in SQL , of mijn boek, SQL-antipatronen:de valkuilen van databaseprogrammering vermijden .



  1. Laravel Query Builder - Hoe kan ik optellen?

  2. Databaseschema voor berichten naar meerdere gebruikers

  3. MYSQL:Procedure met if-statement

  4. Verschil tussen database, tabel, kolomsortering