在数据库中存储多个选择值

时间:2009-09-28 19:19:56

标签: sql database-design data-modeling denormalization

假设我提供用户检查她说的语言并将其存储在数据库中。重要的一点是,我不会搜索db中的任何值,因为我将有一些单独的搜索引擎用于搜索。 现在,存储这些值的显而易见的方法是创建一个类似

的表
UserLanguages
(
 UserID nvarchar(50),
 LookupLanguageID int
)

但该站点将是高负载,我们正试图消除任何可能的开销,所以为了避免在UI上显示结果时与主成员表连接,我想在主表中为用户存储语言,用逗号分隔,如“12,34,65”

同样,我不会搜索它们,所以我不担心必须在该列上进行全文索引。

我真的没有看到这个解决方案有任何问题,但是我忽略了什么吗?

谢谢, 安德烈

9 个答案:

答案 0 :(得分:15)

别。

  • 您现在不会搜索
  • 数据对于除了这种情况之外的任何事情都是无用的
  • 没有数据完整性(例如没有FK)
  • 您仍需要更改为“英语,德语”等以显示
  • “给我所有说x的用户= =失败
  • 该列表实际上是一个演示文稿问题

这是你的系统,我期待以后回答不可避免的“帮助”问题......

答案 1 :(得分:12)

你现在可能不会遗漏任何东西,但是当你的要求发生变化时,你可能会后悔这个决定。你应该像你建议的第一直觉那样将它标准化。这是正确的方法。

您所建议的是经典的过早优化。您还不知道该加入是否会成为瓶颈,因此您不知道您是否真的在购买任何性能改进。等到你可以分析这个东西,然后你就会知道是否需要对这个东西进行优化。

如果确实如此,我会考虑一个物化视图,或者其他一些方法,它使用规范化数据预先计算答案,并将其作为不被视为记录簿的缓存。

更一般地说,如果有必要,可以进行许多可能的优化,而不会以您的建议方式影响您的设计。

答案 2 :(得分:11)

这种类型的存储几乎总是回来困扰我。首先,你甚至不是第一个正常的形式。对于另一个,一些经理或其他人肯定会回来说...“嘿,既然我们存储了这个,你能不能给我写一份报告...”

我建议采用标准化设计。把它放在一个单独的表中。

答案 3 :(得分:5)

问题:

  1. 你失去了加入能力(显然)。
  2. 您必须在每个页面加载/回发时重新分析列表。这导致更多代码客户端。
  3. 您将失去尝试保持数据库完整性的所有借口。试想一下,如果您决定稍后再删除一种语言......修复所有用户配置文件的SQL是什么?
  4. 假设您的各种配置文件选项存储在数据库的查找表中,您仍然需要为每个配置文件页面运行“30个查询”。如果不是,那么您必须为每个小改动进行代码部署。坏,非常糟糕。
  5. 根据“不会发生”的事情做出设计决定是失败的绝对秘诀。当然,商界人士说他们永远不会这样做......直到他们想到一个他们绝对必须这样做的理由。今天。完成编码后会立即执行此操作。
  6. 正如我在评论中所述,对低使用率页面的30个查询都不算什么。不要冒汗,绝对不要优化,除非你知道必须确保它是必要的。猜猜SO为它的个人资料页面做了多少查询?

答案 4 :(得分:4)

我通常会忽略您描述的解决方案,当您以这种方式存储关系数据时,您会遇到麻烦。

作为替代解决方案: 您可以存储为一个位掩码整数,例如: 0 - 没有选择 1 - 英语 2 - 西班牙语 4 - 德语 8 - 法国人 16 - 俄语 - 等等2的权力

因此,如果某人选择了英语和俄语,那么该值将为17,您可以使用按位运算符轻松查询这些值。

答案 5 :(得分:4)

过早优化是万恶之源。

编辑: 显然我观察的背景被一些人误解了 - 因此也就是暗示。所以我会澄清。

使模型非规范化以使事情更容易和/或“更高性能” - 例如创建连接列来表示业务信息(如OP案例中) - 我称之为“过早优化”。

虽然可能存在一些极端边缘情况,其中没有其他方法可以获得特定问题域所需的必要性能 - 但应该很少假设是这种情况。一般来说,这种过早的优化会导致长期的悲痛,因为它们难以撤消 - 一旦生产数据模型,更改数据模型比最初部署时需要更多的努力。

在设计数据库时,开发人员(和DBA)应该应用规范化等标准实践,以确保其数据模型表达正在收集和管理的业务信息。我不认为正确使用数据规范化是一种“优化” - 这是一种必要的做法。在我看来,数据建模者应该始终关注可以重构为(至少)第三范式(3NF)的模型。

答案 6 :(得分:2)

如果您不是在查询它们,那么您不会因为最初计划的形式存储任何内容而丢失任何内容。 如果你是这样,那么以逗号分隔的格式存储它们会回来困扰你,我怀疑任何速度节省都会很重要,特别是当你考虑转换它们所需的工作时。

答案 7 :(得分:1)

您似乎非常担心添加一些额外的查找表连接。根据我的经验,实际传输HTML响应并让浏览器呈现它所花费的时间远远超过一些额外的表连接。特别是如果您使用主键和外键的索引(就像您应该这样)。这就像你计划进行多日越野之旅,你担心额外的10分钟浴室停留。

缺乏长期灵活性和数据完整性对于这么小的优化是不值得的(可能没有必要甚至不可察觉)。

答案 8 :(得分:0)

Nooooooooooooooooo !!!!!!!!

正如以上几篇文章所述。

如果你想对这场辩论有一个相反的看法,那就看看wordpress。表格充满了分隔数据,这是一个很棒的简单平台。