MySQL表结构:每个项目的多个属性

时间:2015-05-20 07:50:01

标签: mysql database attributes structure relationship

我想问你哪个是创建我的MySQL数据库结构的最佳方法,具有以下情况。

我有一张items的表格,不需要将其描述为此处唯一重要的字段是ID

现在,我希望能够为每个项目分配一些属性 - 当然是ID。但是我不知道该怎么做,因为我想保持它的动态(因此,如果我想添加一个新的属性类型,我不必修改表结构)。

我的想法

我认为 - 事实上,我现在的结构是 - 我可以制作一个具有以下结构的表items_attributes

+----+---------+----------------+-----------------+
| id | item_id | attribute_name | attribute_value |
+----+---------+----------------+-----------------+
|  1 |       1 | place          | Barcelona       |
|  2 |       2 | author_name    | Matt            |
|  3 |       1 | author_name    | Kate            |
|  4 |       1 | pages          | 200             |
|  5 |       1 | author_name    | John            |
+----+---------+----------------+-----------------+

我以数据为例让您看到这些属性可以重复(它不是关系1对1)。

这种方法的问题

我需要提供一些查询,其中一些用于统计数据,如果我有很多项目的属性,这可能会有点慢。

此外 - 也许是因为我不是MySQL的专家 - 每次我想进行搜索并找到"那些有'放置' ='巴塞罗那' AND' author_name' =' John'",我最终必须为每个条件制作多个JOIN

之前重复这个例子,我的查询最终会像:

SELECT * 
FROM items its 
JOIN items_attributes attr 
   ON its.id = attr.item_id 
      AND attr.attribute_name = 'place' 
      AND attr.attribute_value = 'Barcelona' 
      AND attr.attribute_name = 'author_name' 
      AND attr.attribute_value = 'John';

正如您所看到的,这不会返回任何内容,因为attribute_name在同一行中不能同时包含两个值,并且OR条件不会是我搜索的内容因为项目必须具有所述的两个属性值。

所以唯一的可能性就是在每个搜索条件的同一个重复表上创建一个JOIN,我认为当搜索的条件很多时,它的执行速度很慢。

我喜欢什么

正如我所说,我希望能够保持属性类型具有动态性,因此通过在' attribute_name'上添加新输入。就足够了,无需向表中添加新列。此外,由于它们是1-N关系,因此不能将它们放入'项目中。表作为新列。

如果您认为结构是唯一能够实现我的兴趣的结构,那么如果您能够点亮一些想法,那么搜索查询就不会有很多JOIN s那么它也会很棒。

我不知道是不是很难得到它,因为我一直在苦苦挣扎,直到现在,我还没有找到解决方案。希望你们可以帮助我!

无论如何,谢谢你的时间和关注!

亲切的问候。

2 个答案:

答案 0 :(得分:2)

你在思考正确的方向,normalization的方向。您希望数据库中的常规是fifth normal form(或第六,偶数)。 Stackoverflow this matter

表格属性:

+----+----------------+
| id | attribute_name | 
+----+----------------+
|  1 |          place |
|  2 |    author name |
|  3 |          pages |
+----+----------------+

表ItemAttribute

+--------+----------------+
| item_id|   attribute_id | 
+--------+----------------+
|      1 |              1 |
|      2 |              1 |
|      3 |              2 |
+--------+----------------+

因此,对于对象的每个属性(在本例中为项目),您将创建一个新表并相应地为其命名。它需要大量的连接,但您的数据库将非常灵活和有条理。祝你好运!

答案 1 :(得分:1)

在我的意见中它应该是这样的,我知道有很多表,但实际上它使你的数据库enter image description here正常化 也许这就是为什么因为我不知道你在哪里得到你的att_value列,以及应该包含这些列的内容