【问题标题】:MySQL Table structure: Multiple attributes for each itemMySQL表结构:每个项目的多个属性
【发布时间】: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


    【解决方案1】:

    你的想法是正确的,normalization 的方向。您希望数据库中的正常值是fifth normal form(或第六个,甚至)。 this matter 上的 Stackoverflow。

    表格属性:

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

    表项属性

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

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

    【讨论】:

    • 它没有帮助,因为在这种情况下,他在表 author_name | 中有这些记录约翰author_name |凯特,实际上是页| 200 并且您应该再添加一个表以对该表进行规范化
    • 是的,这就是我对倒数第二句话的意思。对于这种情况,他应该添加 ItemPages 表并插入 (1,200) 作为条目。
    • 感谢您的宝贵时间和回答!正如您所说,我看到所有解决方案都将指向同一个方向,即标准化。我不想拥有看起来我必须拥有的那么多桌子,但如果这是最好的方法,那就没有借口了!我会看看是否有人提供其他方法进行审查。感谢您的时间和参考!
    【解决方案2】:

    在我看来它应该是这样的,我知道有很多表,但实际上它使您的数据库标准化 也许这就是为什么因为我不明白你在哪里得到你的 att_value 列,以及应该包含这些列的内容

    【讨论】:

    • 感谢您的回答!值列是用户动态放置的项目属性。所以用户写道,作者是约翰和凯特,地点是巴塞罗那。但是,用户应该能够编写自定义字段,例如“天气”并在其中写入“多云”(我正在编写一个愚蠢的示例,但让您知道它们来自哪里)。正是出于这个原因,我需要它们是动态的。
    猜你喜欢
    • 1970-01-01
    • 2014-06-06
    • 2012-10-03
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多