Mysql
 sql >> Base de données >  >> RDS >> Mysql

Conception de la base de données :objets avec différents attributs

Il s'agit d'une conception OO classique pour l'inadéquation de l'impédance des tables relationnelles. La conception de table que vous avez décrite est connue sous le nom de "table par sous-classe". Les trois conceptions les plus courantes sont toutes des compromis par rapport à l'apparence réelle de vos objets dans votre application :

  1. Tableau par classe de béton
  2. Table par hiérarchie
  3. Table par sous-classe

La conception que vous n'aimez pas - "où les tables ont 100 colonnes et la plupart des valeurs sont NULL" - est 2. une table pour stocker toute la hiérarchie de spécialisation. C'est la moins flexible pour toutes sortes de raisons, y compris - si votre application nécessite une nouvelle sous-classe, vous devez ajouter des colonnes. La conception que vous décrivez s'adapte beaucoup mieux au changement car vous pouvez l'étendre en ajoutant une nouvelle table de sous-classe décrite par une valeur dans product_type.

L'option restante - 1. Table par classe concrète - est généralement indésirable en raison de la duplication impliquée dans la mise en œuvre de tous les champs communs dans chaque table de spécialisation. Cependant, les avantages sont que vous n'aurez pas besoin d'effectuer de jointures et que les tables de sous-classes peuvent même se trouver sur différentes instances de base de données dans un très grand système.

La conception que vous avez décrite est parfaitement viable. La variation ci-dessous montre à quoi cela pourrait ressembler si vous utilisiez un outil ORM pour effectuer vos opérations CRUD. Remarquez comment l'ID dans chaque table de sous-classe EST la valeur FK de la table parent dans la hiérarchie. Un bon ORM gérera automatiquement la bonne table de sous-classes CRUD en fonction de la valeur des valeurs de discriminateur dans product.id et product.product_type_id uniquement. Que vous envisagiez d'utiliser un ORM ou non, consultez la documentation de la sous-classe jointe d'hibernate, ne serait-ce que pour voir les décisions de conception qu'ils ont prises.

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