Je crée une base de données d'inventaire qui stocke du matériel informatique, comme des ordinateurs de bureau, des ordinateurs portables, des commutateurs, des routeurs, des téléphones mobiles, etc. J'utilise un modèle de supertype / sous-type, où tous les appareils sont stockés dans une seule table et des informations spécifiques est placé dans des tables de sous-types. Mon dilemme est de choisir entre les deux modèles suivants:
Dans le diagramme du haut, tous les appareils partagent des sous-types communs. Par exemple, les ordinateurs de bureau et les ordinateurs portables auraient des enregistrements dans les tableaux suivants: Device, NetworkDevice. Un commutateur aurait des enregistrements dans: Device, NetworkDevice. Un routeur aurait des enregistrements dans: Device, NetworkDevice, WANDevice. Tout appareil dont nous suivons l'emplacement aura un enregistrement dans Emplacement. Quelques avantages et inconvénients auxquels j'ai pensé pour cette configuration:
- Pro: la sélection d'enregistrements sur la base d'un champ commun, comme Hostname ou LocationID, est plus facile.
- Pro: pas de champs nuls.
- Inconvénients: les tables qui devraient être incluses dans les opérations CRUD pour un périphérique particulier ne sont pas évidentes et peuvent confondre les futurs DBA.
Dans le diagramme du bas, tous les appareils ont leur propre sous-type (il y a plus de classes d'appareils qui ne sont pas affichées ici). Dans cette situation, il est évident dans quels enregistrements de tables être insérés ou sélectionnés. Les ordinateurs de bureau et les ordinateurs portables vont dans Ordinateur, etc. Quelques avantages et inconvénients auxquels j'ai pensé pour cette configuration:
- Pro: Il est immédiatement évident quelles tables utiliser pour les opérations CRUD pour les sous-types.
- Pro: Il suffit d'utiliser une seule table pour les opérations CRUD.
- Contre: la sélection d'enregistrements sur la base de champs de sous-type communs nécessite que toutes les tables soient combinées, par exemple la recherche par nom d'hôte ou LocationID.
Dans les deux cas, le champ ClassDiscriminator est placé dans des tables de sous-types à utiliser avec une contrainte CHECK pour contrôler les types qui peuvent être insérés.
Y a-t-il des recommandations pour lesquelles la conception est meilleure, ou est-ce complètement une question d'opinion et dépend de l'objectif prévu de la base de données?
EDIT: Une question spécifique que j'ai à propos du chevauchement de la table "NetworkDevice". Ce tableau est destiné à contenir les informations réseau de tout périphérique avec un nom d'hôte et / ou une adresse IP, qu'il s'agisse d'un ordinateur, d'un commutateur ou d'un routeur. Le chevauchement de ce tableau peut-il causer des problèmes, ou est-il correct de le mettre en œuvre de cette façon?
Merci d'avance pour toute contribution fournie. Veuillez demander si des informations supplémentaires sont nécessaires.