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.
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? –