我正在创建一个数据库表,其中包含我的应用程序中可用的所有标记的列表(就像SO的标记一样)。
目前,我没有与每个标签相关的任何东西(我可能永远都没有),所以我的想法是拥有一些形式
Tags (Tag(pk) : string)
这应该是这样做的吗?或者我应该做一些像
这样的事情Tags (tag_id(pk) : int, tag : string)
我想在第二种情况下查看桌面会比第一种情况更快,但是它还会占用更多空间吗?
由于
答案 0 :(得分:3)
我会用代理键去第二个选项。
这意味着该表占用更多空间,但可能会减少空间,假设您将标记信息作为其他表中的外键(例如帖子/标签表)
使用int
而非string
将使执行外键所需的查找更有效,并且意味着标记标题的更新不需要影响多个表。
答案 1 :(得分:2)
使用整数而不是CHAR
/ VARCHAR
,索引的效果更好,使用专用的整数主键列。如果你需要标签名称是唯一的,你可以添加一个约束,但它可能不值得麻烦。
答案 2 :(得分:2)
你应该选择第二种选择。首先,你永远不知道未来会怎样。其次,您可能以后想要多语言支持或其他使得字符串作为主键的东西有一种奇怪的感觉。第三,我喜欢使用标准程序进行表定义,即。总是有一个列'id'或'pk'。它将业务与技术分开。
很可能你会在索引为整数的情况下获得更快的查找速度。此外,考虑使您的索引聚集以进一步加速。
我不会过分强调性能问题。一旦程序开始通过互联网与数据库通信,您的延迟就会大于数据库所有查询的99%(当然除了报告查询!)。
答案 3 :(得分:0)
这两个选项实现了完全不同的东西。在第一种情况下,您有唯一标签,而在第二种情况下,您没有。您还没有说过TAG_ID在此模型中的用途。除非你有充分理由放入TAG_ID,否则我会坚持使用第一个设计。它更小,似乎能够精确地满足您的要求,Tag似乎是一个更明显的选择(基于熟悉和简单)。