sql >> Database teknologi >  >> RDS >> Mysql

Databasedesign:objekter med forskellige attributter

Dette er et klassisk OO-design til relationelle tabellers impedansmismatch. Det borddesign, du har beskrevet, er kendt som 'tabel pr. underklasse'. De tre mest almindelige designs er alle kompromiser i forhold til, hvordan dine objekter faktisk ser ud i din app:

  1. Tabel pr. betonklasse
  2. Tabel pr. hierarki
  3. Tabel pr. underklasse

Designet du ikke kan lide - "hvor tabeller har 100 kolonner og de fleste af værdierne er NULL" - er 2. en tabel til at gemme hele specialiseringshierarkiet. Dette er den mindst fleksible af alle mulige årsager, herunder - hvis din app kræver en ny underklasse, skal du tilføje kolonner. Det design, du beskriver, imødekommer ændringer meget bedre, fordi du kan tilføje forlænge det ved at tilføje en ny underklassetabel beskrevet af en værdi i product_type.

Den resterende mulighed - 1. Tabel pr. betonklasse - er sædvanligvis uønsket på grund af den dobbeltarbejde, der er involveret i implementeringen af ​​alle de fælles felter i hver specialiseringstabel. Selvom fordelene er, at du ikke behøver at udføre nogen joinforbindelser, og underklassetabellerne kan endda være på forskellige db-instanser i et meget stort system.

Det design, du beskrev, er helt levedygtigt. Variationen nedenfor er, hvordan det kunne se ud, hvis du brugte et ORM-værktøj til at udføre dine CRUD-operationer. Bemærk, hvordan ID'et i hver underklassetabel ER FK-værdien til den overordnede tabel i hierarkiet. En god ORM vil automatisk administrere den korrekte underklassetabel CRUD baseret på værdien af ​​diskriminatorværdierne i product.id og product.product_type_id alene. Uanset om du planlægger at bruge en ORM eller ej, så kig på hibernates tilknyttede underklassedokumentation, om ikke andet for at se de designbeslutninger, de har truffet.

product
=======

id INT
product_name VARCHAR
product_type_id INT -> Foreign key to product_type.product_type_id
valid_since DATETIME
valid_to DATETIME

magazine
========

id INT -> Foreign key to product.product_id
title VARCHAR
..

web_site
========

id INT -> Foreign key to product.product_id INT
name VARCHAR
..


  1. hent data fra mysql og e-mail det

  2. Tilslutning af PolyBase til Salesforce.com

  3. Sådan bruges EXISTS Logical Operator i SQL Server - SQL Server / TSQL Tutorial Del 125

  4. Hentning af forskel mellem antallet af to underforespørgsler