对于以下情况我应该采用两种数据库模式方法中的哪一种,我感到困惑。
我需要为一个网站存储多个属性,例如页面大小、字数、类别等,以及将来可能增加的属性数量。目的是向用户显示此表,他应该能够在数据中快速过滤/排序(因此表结构应该支持快速查询和排序)。我还想保留以前的数据日志以维护更改的时间表。所以我想到的两个表结构选项是:
选项 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 来做正确的事情,或者是否还有其他更好的选择,我什至可能一开始都没有考虑过。