2

对于以下情况我应该采用两种数据库模式方法中的哪一种,我感到困惑。

我需要为一个网站存储多个属性,例如页面大小、字数、类别等,以及将来可能增加的属性数量。目的是向用户显示此表,他应该能够在数据中快速过滤/排序(因此表结构应该支持快速查询和排序)。我还想保留以前的数据日志以维护更改的时间表。所以我想到的两个表结构选项是:

选项 A

网站属性

id,website_id,page_size,word_count,category_id,title_id,......(最多18列,必须记住可能有一些空值,将来可能还需要添加更多列)

website_attributes_change_log

与上面相同的表结构,添加了“change_update_time”列

我觉得这种模式的优点是即使某些属性链接到其他表并且排序也很简单,查询也很容易编写。我猜想稍后添加列的缺点可能是 ALTER TABLE 需要很长时间才能在大型数据表上运行 + 可能有很多行有很多空列。

选项 B

网站属性字段

attribute_id、attribute_name(例如 page_size)、attribute_value_type(例如 int)

网站属性

id、website_id、attribute_id、attribute_value、last_update_time

这里的优势似乎是这种方法的灵活性,因为我可以随时添加列,还可以节省存储空间。但是,尽管我很想采用这种方法,但我觉得在需要显示表格时编写查询会特别复杂[因为我需要一次显示多个站点的记录,并且还会有交叉引用某些属性的其他表的值] + 对数据进行排序可能很困难[鉴于这不是基于列的方法]。

我要查看的示例输出是:

Site-A.com,232032 字节,232 字,PR 4,房地产 [链接到类别表],..

Site-B.com, ..., ..., ... ,...

并且用户需要能够按所有基于数字的列进行排序,在这种情况下,方法 B 可能会很困难。

因此,我想知道我是否会通过选择 A 来做正确的事情,或者是否还有其他更好的选择,我什至可能一开始都没有考虑过。

4

5 回答 5

2

我建议使用选项 A。

您可以使用pt-online-schema-change减轻长时间运行的 ALTER TABLE 的痛苦。

即将推出的 MySQL 5.6 支持非阻塞 ALTER TABLE操作。

选项 B 称为Entity-Attribute-Value或 EAV。这打破了关系数据库设计的规则,因此针对这种格式的数据编写 SQL 查询肯定会很尴尬。你可能会后悔使用它

我曾多次在 Stack Overflow 上发表文章,描述 EAV 的缺陷。
同样在我的博客中:EAV FAIL

于 2012-12-05T07:40:03.490 回答
0

您应该选择选项 2,因为它更灵活并且使用更少的内存。当您使用 option1 时,您必须将大量内容提取到 ram 中,这样会增加页面错误的机会。如果你想增加数据库的查询时间,那么你应该大胆地索引你的数据库以获得快速的结果

于 2012-12-05T07:24:47.963 回答
0

选项 A 是一个更好的方法,虽然在警报表添加额外列时时间可能会很大,但查询和排序选项会更快。我以前用过类似Option A的设计,当alert table同时有数百万条记录时,不会花费太长时间。

于 2012-12-05T07:18:27.813 回答
0

我认为选项 A 不是一个好的设计。当您设计一个好的数据模型时,您不应该在将来更改表。如果您使用 SQL 语言,在选项 B 中使用查询将不难。这也是您真正问题的解决方案:“您需要存储某些网页的一些属性(打开数,而不是最终属性),因此,存在一个实体来表示这些属性”

于 2012-12-05T07:58:11.433 回答
-1

使用选项 A,因为属性是固定的。从第二个模型查询和处理数据将很困难,因为将有基于多个属性的查询。

于 2012-12-05T08:19:54.660 回答