我想做一个公告系统。但我搞砸了数据库设计部分。
系统将有无限的类别及其项目,因此每个类别都会有奇怪的属性
例如汽车有型号、贸易、制造日期、颜色、档位类型。. . 和更多
另一个例子房地产有门数,花园,复式三层,多少个浴室,多少个厨房
另一种可以是电子的,它有百万像素、千兆字节、保修、分辨率、尺寸、出货量。. .
那么我如何将这些数据收集在一起,也许某些对象将具有相似的属性,例如大多数物品必须具有制造商日期,那么我如何使用这些数据?怎么可能是架构?
塞尔坎·维兰
我想做一个公告系统。但我搞砸了数据库设计部分。
系统将有无限的类别及其项目,因此每个类别都会有奇怪的属性
例如汽车有型号、贸易、制造日期、颜色、档位类型。. . 和更多
另一个例子房地产有门数,花园,复式三层,多少个浴室,多少个厨房
另一种可以是电子的,它有百万像素、千兆字节、保修、分辨率、尺寸、出货量。. .
那么我如何将这些数据收集在一起,也许某些对象将具有相似的属性,例如大多数物品必须具有制造商日期,那么我如何使用这些数据?怎么可能是架构?
塞尔坎·维兰
请注意,这是一个非常模糊的问题,所以我正在尽力回答:)
注意:有很多更好的方法可以做到这一点,我可能会质疑你为什么这样做,但下面的方法应该可以完成你正在寻找的!
这里有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)
我希望这就是您正在寻找的,它是一个无限可扩展的解决方案,尽管如果数据库因繁重的工作负载而变得异常繁重,它可能会因为其设计而变慢。