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

Progettazione di database:oggetti con attributi diversi

Questo è un classico design OO per la mancata corrispondenza dell'impedenza delle tabelle relazionali. Il design della tabella che hai descritto è noto come "tabella per sottoclasse". I tre design più comuni sono tutti compromessi rispetto all'aspetto reale dei tuoi oggetti nella tua app:

  1. Tabella per classe di calcestruzzo
  2. Tabella per gerarchia
  3. Tabella per sottoclasse

Il design che non ti piace - "dove le tabelle hanno 100 colonne e la maggior parte dei valori sono NULL" - è 2. una tabella per memorizzare l'intera gerarchia di specializzazione. Questo è il meno flessibile per tutti i tipi di motivi, tra cui:se la tua app richiede una nuova sottoclasse, devi aggiungere colonne. Il design che descrivi si adatta molto meglio al cambiamento perché puoi aggiungere estenderlo aggiungendo una nuova tabella di sottoclassi descritta da un valore in product_type.

L'opzione rimanente - 1. Tabella per classe concreta - è solitamente indesiderabile a causa della duplicazione coinvolta nell'implementazione di tutti i campi comuni in ciascuna tabella di specializzazione. Tuttavia, i vantaggi sono che non sarà necessario eseguire alcun join e le tabelle delle sottoclassi possono anche trovarsi su diverse istanze db in un sistema molto grande.

Il progetto che hai descritto è perfettamente praticabile. La variazione seguente è come potrebbe apparire se si utilizzasse uno strumento ORM per eseguire le operazioni CRUD. Si noti come l'ID in ogni tabella di sottoclasse È il valore FK della tabella padre nella gerarchia. Un buon ORM gestirà automaticamente la corretta tabella delle sottoclassi CRUD in base al valore dei valori del discriminatore solo in product.id e product.product_type_id. Indipendentemente dal fatto che tu stia pianificando di utilizzare un ORM o meno, guarda la documentazione della sottoclasse unita di Hibernate, anche solo per vedere le decisioni di progettazione che hanno preso.

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
..