2009-08-11 17 views
1

Je veux faire un système d'annonce. Mais j'ai foiré la partie de conception de base de données.Mysql Database Design Un catalogue d'achats complexes Part

Le système aura des catégories illimitées et leurs éléments de sorte que chaque catégorie a des propriétés étranges volonté

pour voiture par exemple a un modèle, le commerce, la date de fabrication, la couleur, le type d'engin. . . et plus

un autre exemple Real Estate a un nombre de porte, jardinée, dublex type triplex, combien de bain, combien de cuisine

une autre peut être électronique, il a mégapixels, gigaoctet, warrantie, la résolution, les dimensions, expédition . . .

alors comment puis-je collecter ces données ensemble peut-être que certains objets auront des propriétés similaires, par exemple la plupart des éléments doivent avoir une date de manufacter ainsi comment puis-je utiliser les données? Comment peut-être le schéma?

Sercan Virlan

+0

Y at-il une liste définie de catégories, ou quelqu'un pourrait décider qu'ils veulent ajouter une catégorie avec des propriétés arbitraires à tout moment? –

Répondre

3

Rappelez-vous, c'est une question très vague, donc je suis en train de mon mieux pour répondre :)

Note: Il y a beaucoup de meilleures façons de le faire, et je pourrais demander pourquoi vous le faites de cette façon, mais la méthode ci-dessous devrait accomplir ce que vous cherchez!

Voici 3 tables:

CREATE TABLE `object` (
`id` INTEGER NOT NULL AUTO_INCREMENT , 
`category` INTEGER NOT NULL , 
`name` VARCHAR(100) NOT NULL , 
PRIMARY KEY (`id`) 
); 

CREATE TABLE `properties` (
`id` INTEGER NOT NULL AUTO_INCREMENT , 
`objectid` INTEGER NOT NULL , 
`property_key` VARCHAR(100) NOT NULL , 
`property_value` MEDIUMTEXT NOT NULL , 
PRIMARY KEY (`id`) 
); 

CREATE TABLE `category` (
`id` INTEGER NOT NULL AUTO_INCREMENT , 
`name` VARCHAR(100) NOT NULL , 
PRIMARY KEY (`id`) 
); 

Maintenant nous allons ajouter un peu de faire semblant de données dans les:

INSERT INTO category VALUES ("","CAR"); 
INSERT INTO category VALUES ("","REALESTATE"); 
INSERT INTO category VALUES ("","ELECTRONIC"); 
INSERT INTO object VALUES ("",1,"98 CAMERO"); 
INSERT INTO object VALUES ("",1,"06 PRIUS"); 
INSERT INTO object VALUES ("",2,"A House Someplace"); 
INSERT INTO object VALUES ("",3,"iPod Touch"); 
INSERT INTO object VALUES ("",3,"iPhone"); 
INSERT INTO object VALUES ("",3,"Zune"); 
INSERT INTO properties VALUES ("",1,"color","red"); 
INSERT INTO properties VALUES ("",1,"doors","4"); 
INSERT INTO properties VALUES ("",1,"engine","v6"); 
INSERT INTO properties VALUES ("",2,"engine","electric"); 
INSERT INTO properties VALUES ("",2,"doors","4"); 
INSERT INTO properties VALUES ("",2,"color","blue"); 
INSERT INTO properties VALUES ("",6,"video-playback","true"); 
INSERT INTO properties VALUES ("",4,"video-playback","true"); 
INSERT INTO properties VALUES ("",5,"video-playback","true"); 
INSERT INTO properties VALUES ("",6,"manufacturer","microsoft"); 
INSERT INTO properties VALUES ("",5,"manufacturer","apple"); 
INSERT INTO properties VALUES ("",4,"manufacturer","apple"); 

Maintenant, voici ce que nos données devraient ressembler.

mysql> select * from object; 
+----+----------+-------------------+ 
| id | category | name    | 
+----+----------+-------------------+ 
| 1 |  1 | 98 CAMERO   | 
| 2 |  1 | 06 PRIUS   | 
| 3 |  2 | A House Someplace | 
| 4 |  3 | iPod Touch  | 
| 5 |  3 | iPhone   | 
| 6 |  3 | Zune    | 
+----+----------+-------------------+ 
6 rows in set (0.00 sec) 

mysql> select * from category; 
+----+-------------+ 
| id | name  | 
+----+-------------+ 
| 1 | CAR   | 
| 2 | REALESTATE | 
| 3 | ELECTRONICS | 
+----+-------------+ 
3 rows in set (0.00 sec) 

mysql> select * from properties; 
+----+----------+----------------+----------------+ 
| id | objectid | property_key | property_value | 
+----+----------+----------------+----------------+ 
| 1 |  1 | color   | red   | 
| 2 |  1 | doors   | 4    | 
| 3 |  1 | engine   | v6    | 
| 4 |  2 | engine   | electric  | 
| 5 |  2 | doors   | 4    | 
| 6 |  2 | color   | blue   | 
| 7 |  6 | video-playback | true   | 
| 8 |  4 | video-playback | true   | 
| 9 |  5 | video-playback | true   | 
| 10 |  6 | manufacturer | microsoft  | 
| 11 |  5 | manufacturer | apple   | 
| 12 |  4 | manufacturer | apple   | 
+----+----------+----------------+----------------+ 
12 rows in set (0.00 sec) 

Vous pouvez ajouter un nombre illimité de catégories, un nombre illimité de propriétés, et un nombre illimité d'objets dans tous ces tableaux.

Maintenant, pour les rejoindre tous ensemble:

mysql> SELECT * FROM object 
    -> LEFT JOIN category ON object.category = category.id 
    -> LEFT JOIN properties ON properties.objectid = object.id; 
+----+----------+-------------------+------+-------------+------+----------+----------------+----------------+ 
| id | category | name    | id | name  | id | objectid | property_key | property_value | 
+----+----------+-------------------+------+-------------+------+----------+----------------+----------------+ 
| 1 |  1 | 98 CAMERO   | 1 | CAR   | 1 |  1 | color   | red   | 
| 1 |  1 | 98 CAMERO   | 1 | CAR   | 2 |  1 | doors   | 4    | 
| 1 |  1 | 98 CAMERO   | 1 | CAR   | 3 |  1 | engine   | v6    | 
| 2 |  1 | 06 PRIUS   | 1 | CAR   | 4 |  2 | engine   | electric  | 
| 2 |  1 | 06 PRIUS   | 1 | CAR   | 5 |  2 | doors   | 4    | 
| 2 |  1 | 06 PRIUS   | 1 | CAR   | 6 |  2 | color   | blue   | 
| 3 |  2 | A House Someplace | 2 | REALESTATE | NULL |  NULL | NULL   | NULL   | 
| 4 |  3 | iPod Touch  | 3 | ELECTRONICS | 8 |  4 | video-playback | true   | 
| 4 |  3 | iPod Touch  | 3 | ELECTRONICS | 12 |  4 | manufacturer | apple   | 
| 5 |  3 | iPhone   | 3 | ELECTRONICS | 9 |  5 | video-playback | true   | 
| 5 |  3 | iPhone   | 3 | ELECTRONICS | 11 |  5 | manufacturer | apple   | 
| 6 |  3 | Zune    | 3 | ELECTRONICS | 7 |  6 | video-playback | true   | 
| 6 |  3 | Zune    | 3 | ELECTRONICS | 10 |  6 | manufacturer | microsoft  | 
+----+----------+-------------------+------+-------------+------+----------+----------------+----------------+ 
13 rows in set (0.00 sec) 

J'espère que c'est ce que vous cherchez, sa solution infiniment évolutive, mais si la base de données est incroyablement imposé avec une lourde charge de travail, il pourrait ralentir , juste en raison de son design.

+0

merci pour votre réponse il y avait une petite information que j'oublie de mentionner à ce sujet je dois utiliser ces valeurs sur les formulaires et les formulaires doivent avoir des cases à cocher boîtes d'entrée selectboxes etc alors comment je dois regrouper les valeurs avec des éléments de formulaire pour un catégorie pour montrer sa forme? –