2010-01-20 4 views
0

Je ces tableaux:Mon dernier mysql db, quelqu'un pourrait-il vérifier si les tables sont correctement faites?

category table: 
cat_id (PK) 
cat_name 

category_options table: 
option_id (PK) 
cat_id (FK) 
option_name 

option_values table: 
value_id (PK) 
option_id (FK) 
value 

classifieds table: 
ad_id (PK) (VARCHAR) something like "Bmw330ci_28238239832" 
poster_id (FK) 
cat_id (FK) 
headline 
description 
price 
etc.... 

posters table: 
poster_id (PK) 
name 
email 
tel 
password 
etc.... 

Trois questions principales:
1- est-il assez bien au-dessus? Cela couvre tous mes besoins au moins ...

2- Parfois, lorsque j'essaie différentes requêtes, j'obtiens des résultats étranges ... Pourriez-vous écrire une chaîne de requête PHP qui va chercher une annonce complète à partir d'un ad_id seulement? (Imaginez la seule variable que vous avez est ad_id)

3- Dans la chaîne de requête, dois-je spécifier toutes les différentes tables qui sont connectées afin d'afficher une annonce? Je ne peux pas simplement utiliser quelque chose comme "SELECT * FROM classifieds WHERE ad_id = $ ad_id" et gérer les liens automatiquement, c'est-à-dire récupérer toutes les informations liées aussi?

Merci et si vous avez besoin de plus d'informations faites le moi savoir!

+1

Je changerais ad_id en une valeur int/bigint si possible et stocker votre VARCHAR dans une nouvelle colonne. – davek

+0

ok, je vais le faire ... –

+0

se débarrasser de la varchar PK dans les petites annonces comme @davek suggère et faire des affiches utiliser un int id PK (poster_id) similaire à ce que vous avez fait dans les autres tables, et faire un nom colonne de données, de sorte que vous rejoignez int prénom. bien si vous avez besoin de changer un nom, comme ce qui se passe après un mariage/divorce –

Répondre

1

1) Si cela répond à vos besoins, cela ne suffirait-il pas à le rendre «assez bon»? Mais sérieusement, je serais d'accord avec davek que vous devriez faire un int/bigint pour le champ ad_id, et je suggèrerais la même chose pour la table posters. Faites du nom un champ de valeur régulière et créez un champ PK autonum int/bigint. Si, pour une raison quelconque, l'utilisateur souhaite modifier son nom (pour des raisons de confidentialité, par exemple), vous devrez également mettre à jour toutes les clés étrangères dans la base de données. Avec une clé autonum, vous n'auriez pas ce problème.

2) Oui, d'après ce que je vois, vous devriez être capable de rassembler toutes les données sur une annonce en ne connaissant que le ad_id.

3) Non, vous devez faire plus que cela, soit équi-jointure dans une requête SELECT, ou utiliser le mot-clé JOIN pour tirer vos données. MySQL ne dispose pas d'un modèle de relation « méta » (comme MS Access), de sorte qu'il ne comprendra pas automatiquement vos relations de clé primaire/étrangère.

2

Vous avez de sérieux problèmes de conception. N'utilisez jamais de nom en tant que PK; Ce n'est pas unique et il est sujet à changement! Les femmes changent leurs noms quand elles se marient par exemple. En fait, n'utilisez pas de varchars comme PKS du tout. Utilisez plutôt des clés de substitution. Les clés de substitution ne changent pas, les valeurs des touches de texte le font souvent et elles sont également plus lentes.

Et ne jamais stocker le nom comme un seul champ, c'est une mauvaise pratique. Au minimum, vous avez besoin du prénom, du nom, du deuxième prénom et du suffixe. Vous aurez également besoin d'un champ d'identification auto-incrémenté afin que John Smith à une adresse à Chicago puisse exister dans la table avec un autre John Smith qui habite ailleurs à Chicago.

Non, vous ne pouvez pas obtenir toutes les données des tables connexes sans les ajouter à la requête en utilisant une jointure. C'est la base de données 101 et si vous ne le savez pas, vous ne comprenez pas suffisamment les bases de données relationnelles pour en concevoir une. Faites des recherches sur les jointures et les requêtes. Vous pouvez obtenir toutes les informations pour une annonce simplement en ayant l'identifiant de l'annonce, car vos relations actuelles semblent fonctionner.

N'utilisez pas de jointures implicites lorsque vous ajoutez les autres tables à vos requêtes. Ils sont dépassés depuis 18 ans. Apprenez correctement en utilisant des jointures explicites.

+0

re. "les femmes changent de nom lorsqu'elles se marient" ... assurez-vous que votre validateur autorise les traits d'union. –

Questions connexes