2009-08-11 39 views
1

我想制作一个通知系统。但我搞砸了数据库设计部分。Mysql数据库设计一个复杂的购物目录零件

该系统将有无限的类别及其项目,使每个类别将有奇怪的特性

例如汽车有一个模型,贸易,生产日期,颜色,齿轮式。 。 。多

另一个例子房地产有一个门计数,花园式,复式三缸类型,多少洗澡,另一个人可以有多少厨房

是电子,它拥有百万像素,技嘉,warrantie,分辨率,尺寸,装运。 。 。

所以我怎么可以一起收集这些数据也许一些对象会有类似的属性,例如大多数项目必须有一个manufacter日期,所以我如何使用数据?模式如何?

Sercan Virlan

+0

是否有确定的类别列表,或者有人可能决定随时添加具有任意属性的类别? – 2009-08-11 15:44:23

回答

3

你要知道,这是一个非常模糊的问题,所以我想我最好的回答:)

注:有很多更好的方法来做到这一点,我可能会问,为什么你这样做,但下面的方法应该完成你正在寻找的东西!

这里有3个表:

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`) 
); 

现在让我们添加一些假装数据转换成他们:

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"); 

现在,这里是我们的数据应该是什么样子。

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) 

您可以将无限数量的类别,无限数量的属性和无限数量的对象添加到这些表中。

现在加入他们一起:

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) 

我希望这是你在找什么,它的无限可扩展的解决方案,但如果数据库变得令人难以置信的被繁重的工作征税,它可以减缓,只是由于其设计。

+0

感谢您的回复 有一些信息,我忘了提及它我必须使用这些值的形式 和窗体必须有复选框输入框选择框等等所以我必须如何组合值的表单元素类显示其形式? – 2009-08-11 21:30:13