我想问你哪个是创建我的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那么它也会很棒。
我不知道是不是很难得到它,因为我一直在苦苦挣扎,直到现在,我还没有找到解决方案。希望你们可以帮助我!
无论如何,谢谢你的时间和关注!
亲切的问候。
答案 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)
在我的意见中它应该是这样的,我知道有很多表,但实际上它使你的数据库正常化 也许这就是为什么因为我不知道你在哪里得到你的att_value列,以及应该包含这些列的内容