2010-01-15 4 views
0

J'ai besoin de quelques entrées sur la façon dont je devrais structurer mon DB.Besoin d'une contribution sur le schéma MySQL

Disons que je veux stocker les données des membres dans la table des membres. Il y a deux types de membres, disons une personne et une organisation. La personne et l'organisation ont un ensemble d'informations différent, de sorte que nous devons les stocker dans deux tables différentes: disons les personnes et les organisations.

j'aurais les tableaux suivants:

membres:

id 
member_type_id 
status 
etc.. 

member_types:

id 
type (person|organization|or any other type if needed) 

personnes:

id 
name 
etc 

organisation:

id 
name 
etc 

Ma question est: Quel est le meilleur des suivants?

  1. Avez-MEMBER_ID dans les deux personnes et organisations tables
  2. Demandez une colonne supplémentaire dans la table des membres pour stocker soit person_id ou organization_id
  3. ont deux colonnes supplémentaires dans le tableau des membres pour stocker person_id ou organization_id selon le cas

Il existe une autre exigence selon laquelle une autre table peut faire référence à la table des personnes et des organisations. Disons que nous avons une table appelée visiteurs qui peut aussi être une personne ou une organisation.

Nous vous remercions de votre participation.

Répondre

1

Il est généralement préférable de dessiner vos relations de sorte qu'il est plus facile de comprendre comment les 2 entités se rapportent. Cela vous permettra de dire facilement que c'est un un-à-un, plusieurs-à-un, un-à-plusieurs, ou plusieurs-à-plusieurs, etc.

Cela étant dit une fois que vous comprenez cela, il est trivial à installer.

Si vous utilisiez Java ou .Net, vous pouvez utiliser Hibernate/NHibernate pour créer automatiquement les tables à votre place en spécifiant les relations.

Voici comment je concevoir les tableaux de ce que vous décrivez: (Gardez à l'esprit, cela suit le schéma de nommage Java)

MemberType 
id  (int11, auto increment, primary key) 
name (varchar31, unique) 

One note about MemberType, if you're using Java and you will not dynamically add/remove member types, you should use an enum here. 


Member 
id (int11, auto increment, primary key) 
memberType_id (int11, on update cascade, on delete cascade) 


Organization 
id (int11, auto increment, primary key) 
name (varchar31, unique) 

-- Depends on how you want this structured (I would design it as a many-to-many relationship 
MemberOrganization 
member_id  (int11, on update cascade, on delete cascade, this links to the member id) 
organization_id (int11, on update cascade, on delete cascade, this links to the organization id) 

Pour obtenir une liste de tous les membres d'une organisation particulière Après avoir réexaminé votre question, je pense que vous cherchez une réponse différente.

Walter

0

Vous pouvez aussi le faire:

Membre id Nom état

personne (étend membre) id (liens vers id membre)

Organisation

(étend Membre) id

Visiteur id Date member_id (encore une fois, ce liens vers la table de membre, vous devrez faire une jointure externe pour obtenir les données membres réels, soit personne ou organisation)

Il utilise une clé primaire colonne de jointure et héritage à travers une table séparée par sous-classe. Dans Hibernate, les requêtes sont automatiquement écrites/gérées pour vous, mais elles ne sont pas si difficiles à écrire. Faites-moi savoir si cela peut vous aider.

Aussi, utilisez-vous PHP, Java, etc, et pouvez-vous fournir plus d'informations de fond dans ce que vous avez besoin ou que vous utilisez pour cela? Il pourrait y avoir une meilleure conception de la table qui soit très différente de celle-ci. Comme je l'ai dit, il existe des outils qui automatisent ce genre de choses pour vous, donc vous ne vous souciez pas des détails de bas niveau. Bien sûr, vous devez comprendre la relation avant même d'utiliser les outils, sinon vous ne serez pas mieux lotis. Il est bon de les comprendre, mais les outils sont optimisés pour 90% des choses dont vous aurez besoin.

Walter

Questions connexes