【发布时间】:2015-05-20 07:50:00
【问题描述】:
我想问你在以下情况下创建我的 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 专家 - 每次我想进行搜索并找到“那些具有 'place' = 'Barcelona' AND 'author_name' = 'John' 的项目”时,我最终都会必须为每个条件创建多个JOINs。
重复之前的示例,我的查询结果如下:
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 关系,它们不能作为新列放入“项目”表中。
如果您认为该结构是唯一能满足我兴趣的结构,那么如果您能提出一些想法,这样搜索查询就不会出现大量 JOINs,那也很棒。
我不知道是不是很难得到它,因为我一直在苦苦挣扎,直到现在我还没有想出解决方案。希望大家能帮帮我!
无论如何,感谢您的时间和关注!
亲切的问候。
【问题讨论】:
标签: mysql database attributes structure relationship