Maison >base de données >tutoriel mysql >Comment établir et appliquer efficacement des relations individuelles dans la conception de bases de données avec héritage ?

Comment établir et appliquer efficacement des relations individuelles dans la conception de bases de données avec héritage ?

DDD
DDDoriginal
2025-01-13 17:46:42478parcourir

How to Effectively Establish and Enforce One-to-One Relationships in Database Design with Inheritance?

Mise en œuvre et application de relations un-à-un dans la conception de bases de données à l'aide de l'héritage

Le défi : Les structures de bases de données complexes nécessitent souvent des relations un-à-un. Un scénario impliquant une table centrale Storage liée à la fois aux tables Van et Warehouse illustre ce défi. Comment pouvons-nous établir et maintenir efficacement ces relations, en garantissant l’intégrité des données ?

Stratégies d'héritage dans la conception de bases de données :

Plusieurs approches existent pour représenter l'héritage dans les bases de données :

  • Héritage de table unique : Toutes les entités (parent et enfants) résident dans une seule table.
  • Héritage de table concrète : Chaque entité enfant a sa propre table ; aucune table parent n'existe.
  • Héritage des tables de classes : Des tables distinctes sont créées pour chaque entité (parent et enfants).

Solution optimale : héritage des tables de classes et application au niveau des applications

Pour les scénarios Storage, Van et Warehouse, la méthode « Class Table Inheritance » est préférée. Cependant, l'application à la fois de la présence et de l'exclusivité des relations entre entités enfants nécessite des vérifications au niveau de l'application :

  • Présence : Garantir un Storage enregistrement pour chaque Van ou Warehouse enregistrement.
  • Exclusivité : Assurez-vous qu'un Storage enregistrement est lié à un seul Van OU à un Warehouse enregistrement, jamais aux deux.

Bien que les contraintes de clé étrangère puissent aider, l'obtention d'une exclusivité complète peut nécessiter des procédures stockées et une logique au niveau de l'application pour empêcher les mises à jour directes, potentiellement conflictuelles, des tables par les clients. L'absence de contraintes différées dans Microsoft SQL Server complique les solutions purement basées sur des contraintes.

Alternative : imposer l'exclusivité sans contraintes différées

Une méthode alternative évite les contraintes différées en ajoutant une colonne STORAGE_TYPE :

  • Van Table : Une colonne STORAGE_TYPE calculée définie sur 0.
  • Table d'entrepôt : Une colonne STORAGE_TYPE calculée définie sur 1.

Des contraintes uniques sont ensuite appliquées à la combinaison (STORAGE_ID, STORAGE_TYPE) :

<code class="language-sql">CREATE TABLE VAN (
    STORAGE_ID int PRIMARY KEY,
    STORAGE_TYPE AS CAST(0 as tinyint) PERSISTED,
    FOREIGN KEY (STORAGE_ID, STORAGE_TYPE) REFERENCES STORAGE(STORAGE_ID, STORAGE_TYPE)
);

CREATE TABLE WAREHOUSE (
    STORAGE_ID int PRIMARY KEY,
    STORAGE_TYPE AS CAST(1 as tinyint) PERSISTED,
    FOREIGN KEY (STORAGE_ID, STORAGE_TYPE) REFERENCES STORAGE(STORAGE_ID, STORAGE_TYPE)
);</code>

Cette approche garantit qu'un seul STORAGE_ID ne peut être associé qu'à un Van ou un Warehouse, renforçant ainsi l'exclusivité de la relation un-à-un. Cependant, la présence nécessite toujours une vérification au niveau de l'application.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn