Question

Je suis la programmation d'un site Web qui permet aux utilisateurs de publier des annonces avec des champs détaillés pour différents types d'articles qu'ils vendent. Cependant, j'ai une question sur le meilleur schéma de base de données.

Le site propose de nombreuses catégories (par exemple. Voitures, ordinateurs, appareils photo) et chaque catégorie d'annonces ont leurs propres champs distincts. Par exemple, les voitures ont des attributs tels que le nombre de portes, la marque, le modèle et la puissance alors que les ordinateurs ont des attributs tels que le processeur, la RAM, la carte mère modèle, etc.

Maintenant, car ils sont tous les listings, je pensais à une approche polymorphes, création d'une table de parents et LISTES une table enfant différent pour chacune des différentes catégories (ORDINATEURS, voitures, Compacts). Chaque table enfant aura un listing_id qui reliera à la table LISTINGS. Alors, quand une liste est tiré par les cheveux, il rapporterait une ligne de LISTES reliés par la ligne liée à la table des enfants associés.

LISTINGS
-listing_id
-user_id
-email_address
-date_created
-description

CARS
-car_id
-listing_id
-make
-model
-num_doors
-horsepower

COMPUTERS
-computer_id
-listing_id
-cpu
-ram
-motherboard_model

Maintenant, ce schéma est un bon modèle de conception ou y at-il de meilleures façons de le faire?

Je considérais l'héritage unique mais rapidement brossé la pensée parce que la table sera trop grand trop vite, mais un autre dilemme vient à l'esprit - si l'utilisateur fait une recherche globale sur toutes les annonces, alors cela signifie que je vais devoir interroger chaque table enfant séparément. Qu'est-ce qui se passe si j'ai plus de 100 catégories différentes, ne serait-il inefficace?

J'ai aussi pensé à une autre approche où il y a une table principale (tableau méta) qui définit les champs de chaque catégorie et une table de champ qui stocke les valeurs de champ de chaque liste, mais puissé aller contre la normalisation de base de données?

Comment les sites comme Kijiji faire?

Était-ce utile?

La solution

Votre conception de base de données est très bien. Aucune raison de changer ce que vous avez. Je l'ai vu la recherche fait quelques façons. Est d'avoir votre recherche procédure stockée se joindre à toutes les tables dont vous avez besoin pour effectuer des recherches dans l'index et les colonnes à rechercher. La deuxième façon que je l'ai vu faire ce qui a fonctionné assez bien était d'avoir une table qui est utilisée uniquement pour la recherche qui obtient une copie de ce que les champs qui doivent rechercher. Ensuite, vous mettriez triggers sur les champs et mettre à jour la table de recherche.

Ils ont tous deux inconvénients, mais je préfère la première à la seconde.

EDIT

Vous avez besoin des tableaux ci-dessous.

Catégories - Id - Description

CategoriesListingsXref - CategoryId - ListingId

Avec ce modèle de référence croisée, vous pouvez rejoindre toutes vos annonces pour une catégorie donnée lors de la recherche. Ensuite, ajoutez un peu sql dynamique (car il est plus facile à comprendre) et construire votre requête pour inclure le champ (s) que vous souhaitez rechercher et appeler exécuter sur votre requête.

Voilà.

EDIT 2 Cela semble être un peu plus grand débat que nous pouvons dans ces boîtes nageoire de commentaire. Mais, tout ce que nous discutions peut être compris en lisant le post suivant.          http://www.sommarskog.se/dyn-search-2008.html

Il est vraiment complet et vous montre plus de 1 façon de le faire avec pro et contre. Bonne chance.

Autres conseils

Je pense que la conception que vous avez choisi sera bon pour le scénario que vous venez de décrire. Bien que je ne suis pas sûr si les tables de classe sous devraient avoir leur propre identité. Depuis une voiture est une liste, il est logique que les valeurs sont du même « domaine ».

Dans le site des petites annonces typiques, les données pour une annonce est écrite une fois et est en lecture seule au fond. Vous pouvez exploiter cela et stocker les données dans une deuxième série de tableaux qui sont plus optimisés pour la recherche dans juste la façon dont vous voulez que les utilisateurs de la recherche. En outre, le problème de recherche n'existe vraiment pour une recherche « générale ». Une fois que l'utilisateur choisit un certain type d'annonce, vous pouvez passer aux tables de classe sous afin de faire des recherches plus avancées (RAM> 4gb, cpu = vaincu).

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