je prendrais les choses un peu plus loin ...
Tableau 1 - Société
CompanyID (int)
CompanyName (string)
Exemple
CompanyID 1
CompanyName "Swift Point"
Tableau 2 - Types de contact
ContactTypeID (int)
ContactType (string)
Exemple
ContactTypeID 1
ContactType "AutoEmail"
Tableau 3 Entreprise Contact
CompanyID (int)
ContactTypeID (int)
Addressing (string)
Exemple
CompanyID 1
ContactTypeID 1
Addressing "[email protected]"
Cette solution vous donne comme vous l'extensibilité pas besoin t o ajouter des colonnes pour faire face aux nouveaux types de contact à l'avenir.
SELECT
[company].CompanyID,
[company].CompanyName,
[contacttype].ContactTypeID,
[contacttype].ContactType,
[companycontact].Addressing
FROM
[company]
INNER JOIN
[companycontact] ON [companycontact].CompanyID = [company].CompanyID
INNER JOIN
[contacttype] ON [contacttype].ContactTypeID = [companycontact].ContactTypeID
Cela vous donnerait plusieurs lignes pour chaque entreprise. Une ligne pour "AutoEmail" une ligne pour "AutoPrint" et peut-être dans le futur une ligne pour "ManualEmail", "AutoFax" ou même "AutoTeleport".
Réponse à HLEM.
Oui, c'est bien le modèle EAV. C'est utile lorsque vous voulez avoir une liste extensible d'attributs avec des données similaires. Dans ce cas, différentes méthodes de contact avec une chaîne représentant l'adresse du contact. Si vous ne souhaitez pas utiliser le modèle EAV, vous devez envisager des tables relationnelles plutôt que de stocker les données dans des tables plates. C'est parce que ces données s'étendront presque certainement.
Ni le modèle EAV ni le modèle relationnel ne ralentissent de manière significative les requêtes. Les jointures sont réellement très rapides, comparées à (par exemple) une sorte. Renvoyer un enregistrement pour une entreprise avec tous les types de contact associés, ou même un type de contact spécifique serait très rapide. Je travaille sur une base de données financière MS SQL avec des millions de lignes et des modèles de données similaires et je n'ai aucun problème à renvoyer des quantités significatives de données à des temps inférieurs à la seconde. En termes de complexité, ce n'est pas la conception la plus technique en termes de modélisation de base de données et le concept de joindre des tables est certainement au-dessous de ce que je considère comme développement de base de données de niveau «intermédiaire».
Ceci est exagéré s'il/elle n'aura jamais beaucoup, comme le titre dit One to one. – JonH
Ouais, je pensais vraiment à quelque chose comme ça. Mais je ne savais pas si c'était une bonne idée. Je vais ajouter une table: Paramètres (CompanyID, Setting, Value) car il ne contiendra pas seulement des contacts, mais d'autres informations comme, modèle à utiliser, compte bancaire à utiliser, devise par défaut, etc ... Je me demandais ce qui est mieux, > Valeur ou ayant des colonnes dans les tableaux. –
Les tables EAV sont généralement une mauvaise idée dans la conception de base de données. Ils donnent une flexibilité qui n'est pas nécessaire habituellement (à quelle fréquence ajoutiez-vous un nouveau type? À quelle fréquence les données sont-elles interrogées?), En retour de mauvaises performances et de difficultés d'interrogation. – HLGEM