【问题标题】:The Wide Vs Tall Table - benefits of each宽桌与高桌 - 各有优势
【发布时间】:2018-10-27 11:59:38
【问题描述】:

我想为 UserPreferences 创建一个表。每个用户都有一组有限的用户偏好。所以这可以通过两种方式建模:

  1. 宽表:UserPreferenceByUser(id int, userid int, preference1 int, 首选项2 int)
  2. 一张高大的桌子:UserPreferenceByCode(id int, userid int, code nvarchar(25), 值 int)

速度因素并不重要,因为它们会在应用启动时被检索一次。

1的优缺点:

  • 在客户端,一个对象包含所有首选项。 (更容易在客户端使用)
  • 但是,每次添加首选项时,都必须修改表并更新应用程序。
  • 默认偏好值可以放默认值 领域。

2 的优缺点:

  • 在客户端,一个数组保存首选项。 (更难使用)
  • 如果添加了新首选项,则无需更改数据模型。但是,当添加新用户时,没有默认首选项。
  • 如果查找首选项但未找到,则必须添加新记录,在另一个表 (DefaultUserPreferences) 中查找默认首选项值。

我是否遗漏了上述任何优点或缺点?

在我看来,理想的解决方案是将数据存储为 UserPreferenceByCode,然后返回一组数据,使其在客户端上显示为 UserPreferenceByUser。

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:

    您肯定遗漏了一些注意事项并且有一些错误。

    但是,当添加新用户时,没有默认首选项。

    这是不正确的。默认首选项不像default 约束那么简单,但可以使用触发器、defaultcase 表达式添加它们,或者更常见的是作为“默认”用户。事实上,这可能是一个优势,因为默认值可能会根据用户的其他特征(例如语言或角色)而有所不同。

    您还遗漏了一些重要的注意事项:

    • 宽表通常较小(因为键不重复),尤其是在首选项不稀疏的情况下。
    • 窄表往往要求首选项都具有相同的类型。
    • 窄表允许您维护其他信息,例如更改首选项的日期。

    最后两个考虑因素 - 以及轻松添加新首选项的能力 - 在决定使用哪种方法时通常非常重要。

    在某些情况下,我使用了混合方法,其中初始首选项存储在列中,其他首选项存储在单独的表中,甚至存储在 JSON/XML 列中。

    【讨论】:

    • 关于 JSON 的好建议 - 我之前没有考虑过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多