Question

J'ai une sorte d'un avis de la question, mais en même temps on peut avoir un droit de réponse.Je suis en train de développer une gamme de produits et voulez vous assurer que depuis que je suis en train de faire moi-même de le faire dès la première fois.J'ai ré-écrit le schéma à plusieurs reprises, chaque fois en pensant que c'était mieux.Ensuite, j'ai pu trouver une idée nouvelle, et il serait soit exiger beaucoup de travail sur le schéma, ou elle allait se briser mon schéma.

Au collège, j'ai appris à propos de "rationalisation" (je pense que c'est le mot qu'ils ont utilisés, peut être de façon off) une base de données et il y a 5 niveaux.À partir de ce que je me souviens, niveau 3 était le plus fréquent.Je sais que la pratique est de s'assurer que les données n'ont pas été répétée, et pour ce faire, vous avez eu à briser les tables dans de petites tables.Et en fonction de combien vous avez cassé vers le haut, le plus élevé, le niveau était.Eh bien, je ne sais pas si je veux le plus haut niveau, mais je sais qu'il sera aussi efficace que je peux l'obtenir.J'ai eu 4 ans de SQL Server 2000/2005/2008 et 2 ans d'Oracle, environ 6 mois avec Informix (5+ ans), un contact ici ou là avec mySQL et environ 6 mois d'Accès.Ma préférence est de SQL Server, mais je voudrais le schéma pour être aussi efficace sur les deux plate-forme.

Voici un pseudo schéma de mise en page de certains tableaux, alors je vais vous expliquer ce que je veux faire.

Manufacturers
  ManufacturerID (Identity)
  ManufacturerName
  ManufacturerStreetAddress
  ManufacturerZipCodeID
  ...

ZipCodes
  ZipCodeID (Identity)
  ZipCode
  ZipCodeStateID
  ...

States
  StateID (Identity)
  StateName
  StateAbbreviation
  ...

Cities
  CityID (Identity)
  CityName
  CityStateID
  ...

Je m'en excuse d'être seulement une pseudo schéma, mais c'est tout ce que j'ai en ce moment car je suis en train de faire le dessin sur le papier sur pause, mais a une question avant que je sois trop loin.Ce que je veux faire, c'est de faire en sorte que tout les liens les uns aux autres correctement.Ma conviction est qu'un Code Postal appartient à un État et une Ville, mais aucune Ville n'appartient à tout UN Code Postal, il pourrait avoir de nombreux.Si je mets le Code Postal dans le Fabricants de table, je veux être en mesure d'obtenir de l'État et de la Ville.Mais je ne veux pas utiliser tout les Id de trop nombreuses fois dans d'autres tables.Ce que je veux dire par là, c'est d'avoir StateID dans ZipCodes et les Villes peut être une fois de trop.Un état peut avoir plusieurs villes avec le même nom, et plusieurs états peuvent avoir des villes avec le même nom.Mais je ne suis pas sûr si je voulais un CityNames table, puis un CityStates table (CityNameID et StateID).Je suis bien conscient qu'il existe des bases de données de localisation pour l'achat, peut-être certains, que je pouvais l'utiliser et ne pas avoir à vous inquiéter à ce sujet.Cependant, j'aimerais travailler sur ma compréhension de cette parce que je crois qu'il pourrait m'aider à la conception d'un schéma sage à l'avenir, mais aussi parce que je voudrais avoir le customability de la mise en page si quelque chose a besoin d'être modifié.

Questions:

  1. N'est que pseudo schéma, tel qu'il est, semble correct ou pourrait-il être mieux (d'opinion)?
  2. Est-il appelé "la rationalisation" de la base de données, ou quelque chose d'autre (va voter pour la bonne réponse)?Et à quelle distance est trop loin (l'opinion)
  3. Il y aura également une table des Utilisateurs, et d'autres tables à inclure des adresses (les Équipes, les Capitales, etc.), la pseudo schéma, si elle est correcte, en théorie, être un bon plan pour une base de données de ce genre (d'opinion)?

Merci à tous pour votre temps, je vais voter toute réponse complète et cohérente.Base de données des experts ou des personnes ayant de nombreuses années d'expérience de base de données sont préférés, mais j'écoute toutes les réponses.Aussi, je ne suis pas si sûr que ce doit être une communauté wiki, mais je ne suis pas en le marquant comme un dès maintenant.Merci.

Mise à jour:Aussi, j'ai oublié de mentionner que je sais avec "rationalisation" de la base de données provient de la nécessité pour les jointures et parfois des sous-requêtes.J'ai l'habitude de l'abus de Jointures EXTERNES gauches, mais quel serait le moyen le plus efficace pour lier ces tableaux pour afficher une adresse, plutôt que de réaliser 4 types de requêtes?Merci.

Mise à jour:Ok, maintenant, ce pourrait être trop normalisé ou non normalisé assez ou pas du tout, mais pourriez-vous les gars me dire si vous aimez ce pseudo schéma de mieux?

Manufacturers
  ManufacturerID (Identity)
  ManufacturerName
  ManufacturerStreetAddress
  ManufacturerCCSZID --CCSZ (Country, City, State, Zip), needs a better name
  ...

ZipCodes
  ZipCodeID (Identity)
  ZipCode
  ...

States
  StateID (Identity)
  StateName
  StateAbbreviation
  ...

Cities
  CityID (Identity)
  CityName
  ...

Countries
  CountryID (Identity)
  CountryName
  CountryAbbreviation
  ...

CountryCityStateZipCodes
  CountryCityStateZipCodeID (Identity)
  CCSZCountryID
  CCSZStateID
  CCSZCityID
  CCSZZipCodeID

Et d'obtenir une adresse, il ressemblerait à:

SELECT  M.ManufacturerStreetAddress,
        CN.CountryName,
        CN.CountryAbbreviation,
        S.StateName,
        S.StateAbbreviation,
        C.CityName,
        Z.ZipCode
FROM Manufacturers M
LEFT OUTER JOIN CountryCityStateZipCodes CCSZ ON CCSZ.CountryCityStateZipCodeID = M.ManufacturerCCSZID
LEFT OUTER JOIN Countries CN ON CN.CountryID = CCSZ.CCSZCountryID
LEFT OUTER JOIN States S ON S.StateID = CCSZ.CCSZStateID
LEFT OUTER JOIN Cities C ON C.CityID = CCSZ.CCSZCityID
LEFT OUTER JOIN ZipCodes Z ON Z.ZipCodeID = CCSZ.CCSZZipCodeID

Ou peut-être les gars, vous connaissez une meilleure façon d'écrire cette requête.Mais peu importe, est-ce que l'air mieux que le premier schéma?

Était-ce utile?

La solution

J'ai toujours entendu que cela l'appelait «Normalisation», mais nous parlons de la même chose.

La chose la plus simple peut être de combiner la ville, l'état et la glissière dans une seule table. Vous pouvez même envisager d'utiliser le code postal lui-même comme la clé, bien que je puisse penser à deux raisons pour lesquelles vous voudriez éviter cela:

  1. Les États du Nord-Est ont des codes postaux qui commencent par 0, qui seront tronqués si vous faites du code postal un champ numérique.
  2. Si vous utilisez le code postal comme clé, vous ne pouvez pas avoir ce zip plusieurs fois pour plusieurs villes. Comme vous l'avez dit, le bureau de poste se soucie davantage du zip que du nom de la ville. Mais cette configuration vous empêcherait de rechercher ces villes individuelles plus tard.

Pour rechercher par la ville, l'État ou la fermeture éclair plus tard, rejoignez simplement ce tableau à la table des fabricants. Vous allez bien utiliser une jointure intérieure - à moins qu'il y ait des champs dans la table des fabricants où ManufacturerzipCodeid est vide, auquel cas vous voudrez une jointure de gauche pour que ces affichent également.

Autres conseils

Je n'ai pas beaucoup de problème avec la façon dont vous avez la configuration des choses. Un identifiant d'état dans le code postal pourrait être dangereux - cela ne me surprendrait pas d'apprendre qu'il existe des codes postaux qui franchissent les limites d'état, mais je n'en suis pas sûr.

Vous allez faire beaucoup de jointures en stockant l'État, la ville et le code postal dans des tables distinctes, mais avoir traité des bases de données qui ont stocké les adresses sans mesures de cohérence, c'est beaucoup plus un cauchemar que quelques jointures. Par exemple, vous vous retrouvez avec "NY" et "NY" et "NY" et "New York" et "Newyork". Je pense donc avoir la table séparée pour l'État, la ville et les zips seront payants à long terme.

Je ne suis pas un expert base de données, mais, à mon point de vue, le pseudo schéma semble être incorrect.Voici l'explication.Faits connus de problèmes sont :

  1. Un état peut avoir plusieurs villes.
  2. Un état est unique
  3. Une des villes peut avoir plusieurs Codes postaux
  4. Le nom de la ville peut être égal à un autre nom de la ville.
  5. Un Code Postal est unique

Tout d'abord, écrire les uniques.Nous avons donc la construction de ces deux premières tables :

STATE
---
State ID (PK)
State Name

ZIP
---
Zip ID (PK)
Zip Code (NK)

Alors, une question logique se pose.Le fait de connaître un Zip ID, comment ferions-nous pour récupérer de la Ville d'ID?Pour y répondre, nous avons besoin d'établir un lien entre le Zip et la Ville.Où mettre ce lien sera mis sur?Ce n'est pas dans la Ville de tableau, puisque de Fait#3, nous savons qu'une ville peut avoir beaucoup de différents Zip code.Donc, il doit être dans le ZIP de la table.C'est notre prochaine version de la table de fermeture éclair :

ZIP
---
Zip ID (PK)
Zip Code (NK)
City ID (FK)

Maintenant, puisque l'on peut "passer" de Zip à la Ville, nous allons discuter sur la Ville de tableau.Le nom d'une Ville peut avoir le même nom avec les autres.Nous n'avons donc pas besoin de forcer (Nom de la Ville de champ) pour être unique.Donc, c'est notre première version de la Ville de tableau :

CITY
----
City ID (PK)
City Name

Encore une fois, la même question logique se pose.Comment pouvons-nous passer à l'État de la connaissance d'une Ville?Un lien doit être créé quelque part entre ces deux tables.Encore une fois, sachant#4 ne pouvons rien garantir, à propos de l'unicité du nom de la ville.Le lien doit être mis sur la Ville de tableau.Donc, c'est notre prochaine version de la Ville de tableau :

CITY
---
City ID (PK)
City Name
State ID (FK)

Avec ce lien, on peut récupérer de l'Etat correctement.Dans l'ensemble, nous pouvons nous déplacer à partir de Zip à Ville par Ville ID (fourni dans le Zip de la table) et nous pouvons continuer à passer de la Ville à l'Etat au travers de l'ID (fourni dans la Ville de tableau).

La rationalisation d'une base de données qui est bon dans la Base de données de point de vue, mais peut être considéré comme "mal" dans la perspective de Programmation.Parce qu'il pousse programmeur à écrire de plus en plus de classes.Après tout, "trop loin" peut être définie comme "la table devient irrationnel".Le Nom de la ville de la table de façon irrationnelle, puisque c'est un attribut, pas une entité.Je serai heureux de l'étiquette "trop loin" si ma Base de données Analyste de créer un tel irrationnel de la table :) D'autre part, au cours de-la rationalisation de la base de données peuvent influer grandement sur la performance des bases de données.De mon expérience, il sera fait une requête s'exécute plus lentement.

Concernant les autres problèmes tels que les Utilisateurs, les Équipes, les Capitales, etc.Je ne peux rien dire pour l'instant puisque je n'ai pas vu le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top