J'ai une variété de tables qui représentent des objects de gestion, par exemple des produits, des personnes, des locations et je veux append une table de balises (comme dans la taxonomie).
CREATE TABLE Tags ( tagId bigint IDENTITY, name nvarchar(50) )
Comment puis-je autoriser l'application de plusieurs balises à plusieurs types d'entités de manière à permettre au SGBD d'appliquer l'intégrité référentielle sans avoir besoin d'une table de binding comme celle-ci:
CREATE TABLE TagUse ( tagId bigint, productId bigint NULL, personId bigint NULL, locationId bigint NULL, ... whateverId bigint NULL )
Ou pire:
CREATE TABLE PersonTags ( tagId bigint, personId bigint ) CREATE TABLE LocationTags ( tagId bigint, locationId bigint ) ... CREATE TABLE WhateverTags ( tagId bigint, whateverId bigint )
Je pensais juste à une troisième option: plutôt que d'avoir des tables *Tags
séparées pour chaque entité, on peut penser que chaque entité hérite de " Taggable
" qui est ensuite référencée par les tables enfant:
CREATE TABLE Taggable ( taggableId bigint, tagId bigint ) CREATE TABLE Persons ( personId bigint, ... taggableId bigint )
Vous pouvez utiliser un object de séquence :
CREATE TABLE [TaggableObjects] ( objectId BIGINT IDENTITY(1,1) ) CREATE TABLE [Persons] ( objectId BIGINT, -- referencing Objects.objectId name VARCHAR(50) ) CREATE TABLE [Locations] ( objectId BIGINT, -- referencing Objects.objectId country VARCHAR(50) )
Dans les langages de programmation comme Java
et C#
vous appelez Persons
and Locations
une extension de TaggableObject
.
Après cela, vous pouvez implémenter les Tags
comme:
CREATE TABLE [Tags] ( tagId BIGINT IDENTITY(1,1), objectId BIGINT )
Bien que le problème avec une implémentation comme celle-ci soit que vous deviez find la meilleure façon d'identifier le type de Tags.objectId
.
Notez que selon le moteur que vous utiliserez, de nombreuses fonctionnalités sont disponibles pour implémenter plus facilement un object de séquence, vous pourriez avoir envie de le faire.