2010-04-08 5 views
1

Quel est le meilleur moyen de stocker les paramètres de certains objets dans ma base de données?Préférences de stockage/relations un-à-un dans la base de données

  1. méthode: L'utilisation d'un unique tableau
    Tableau: Société {CompanyID, CompanyName, AutoEmail, AutoEmailAddress, AutoPrint, AutoPrintPrinter}

  2. méthode: L'utilisation deux tables
    Table Société {CompanyID, COmpanyName}
    Tableau2 CompanySettings {SociétéID, utoEmail, AutoEmailAddress, AutoPrint, AutoPrintPrinter}

Répondre

1

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

+0

Ceci est exagéré s'il/elle n'aura jamais beaucoup, comme le titre dit One to one. – JonH

+0

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

+1

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

0

Cela dépend si vous aurez besoin de plus d'informations sur une entreprise. Si vous remarquez que vous ajoutez des champs tels que companyphonenumber1 companyphonenumber2, etc., alors la méthode 2 est préférable car vous sépareriez vos entités et référenceriez simplement un identifiant d'entreprise. Si vous ne prévoyez pas d'effectuer ces changements et que vous pensez que cette table ne changera jamais, la méthode 1 est correcte.

0

Habituellement, si vous n'avez pas de duplication de données, une seule table suffit.

Dans votre cas, la première méthode est OK.

0

J'utilise une table si j'estime que les données de la "deuxième" table seront utilisées dans plus de 50% de mes requêtes. Utilisez deux tableaux si je besoin de plusieurs copies des données (plusieurs numéros de téléphone, adresses e-mail, etc.)

1

Je considérerais si vous avez besoin d'une ou deux tables en fonction des critères suivants: onthe

sont tout d'abord vous fermez la limite de stockage d'enregistrement, puis deux tables définitivement.

Deuxièmement, vous demanderez-vous généralement les informations que vous prévoyez de placer dans la deuxième table la plupart du temps lorsque vous interrogez la première table? Ensuite, une table pourrait avoir plus de sens. Si vous n'avez généralement pas besoin des informations étendues, une table distincte (et moins large) devrait améliorer les performances sur les requêtes de données principales.

Troisièmement, quelle est la possibilité que vous ayez besoin de plusieurs valeurs? Si c'est nopw one-to-one, mais quelque chose comme l'adresse e-mail ou le numéro de téléphone qui a une forte possibilité de se transformer en plusieurs lignes, allez-y et en faire une table liée. Si vous savez qu'il n'y a aucune chance ou seulement une petite chance, alors il est OK de le garder en supposant que la table n'est pas trop large.

Les tables EAV ont l'air d'être belles et permettent de gagner du temps, mais en réalité, elles ne le sont pas. Générallement si vous avez besoin d'ajouter un autre type, vous devez faire un travail futur pour ajuster les questions etc. Écrire un script pour ajouter une colonne prend cinq minutes, l'autre travail doit être là sans tenir compte de la structure. Les tables EAV sont également très difficiles à interroger quand vous ne savez pas combien d'enregistrements vous devrez tirer parce que normalement vous les voulez sur une ligne et obtiendrez l'information en vous joignant à la même table plusieurs fois. Cela provoque des problèmes de performance et de verrouillage, surtout si cette table est au cœur de votre conception. N'utilisez pas cette méthode.

Questions connexes