Mysql Database Design Комплексная часть каталога покупок - PullRequest
1 голос
/ 11 августа 2009

Я хочу сделать систему оповещений. Но я испортил часть дизайна базы данных.

Система будет иметь неограниченное количество категорий и их предметов, поэтому каждая категория будет иметь странные свойства

Например, у автомобиля есть модель, продажа, дата изготовления, цвет, тип передач. , , и больше

еще один пример недвижимости имеет количество дверей, садовый, двухуровневый тип триплекс, сколько ванна, сколько кухня

другой может быть электронным, он имеет мегапиксель, гигабайт, гарантию, разрешение, размеры, отгрузку. , ,

так, как я могу собрать эти данные вместе, может быть, некоторые объекты будут иметь схожие свойства, например, у большинства элементов должна быть дата производства, так как я могу использовать данные? Как может быть схема?

Серкан Вирлан

1 Ответ

3 голосов
/ 11 августа 2009

Имейте в виду, это очень расплывчатый вопрос, поэтому я стараюсь изо всех сил ответить:)

Примечание: Есть много лучших способов сделать это, и я мог бы спросить, ПОЧЕМУ вы делаете это таким образом, но приведенный ниже метод должен выполнить то, что вы ищете!

Вот 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)

Я надеюсь, что это то, что вы ищете, это бесконечно масштабируемое решение, хотя, если база данных будет невероятно обременена высокой нагрузкой, она может замедлиться, просто из-за ее дизайна.

...