假设您有一个包含单个表的数据库,如...
---------------------------------------------
| Name | FavoriteFood |
---------------------------------------------
| Alice | Pizza |
| Mark | Sushi |
| Jack | Pizza |
---------------------------------------------
使用名为“Strings”的附加表来存储字符串,并将FavoriteFood列更改为字符串表中的索引,是否更节省空间。在上面的例子中,“Pizza”看起来像是存储了两次,但是使用附加表,它似乎只存储了一次。当然,请假设有1,000,000行和1,000个唯一字符串,而不仅仅是3行和2个唯一字符串。
编辑:我们事先不知道FavoriteFoods是什么:它们是用户提供的。字符串表的编程接口类似于......
String GetString(int ID) { return String at with Row-ID == ID }
int GetID(String s) {
if s exists, return row-id;
else {
Create new row;
return new row id;
}
}
所以字符串表看起来效率更高,但现代数据库是否已经在后台执行,所以我可以只使用简单的一个表方法并且效率很高?
答案 0 :(得分:4)
你在衡量效率的是什么?假设没有其他数据与每个FavoriteFood相关联(在这种情况下显然你想要两个表),单表方法可能更有时间效率,因为不必要的连接会产生额外的处理成本。另一方面,双表方法可能更节省空间,因为它存储索引所需的空间比字符串少,但这取决于您使用的特定数据库如何优化重复字符串的存储。 / p>
答案 1 :(得分:4)
你应该考虑在问题领域而不是效率方面做出好的设计是什么(除非你期望有数千万行+)。
设计良好的数据库应为3NF(第三范式)。只有在通过测量确定性能问题时才能进行非规范化。
答案 2 :(得分:2)
如果您有另一个表来存储字符串,当您想要更新描述时会更容易,例如,如果您需要将所有Pizzas更新为Italian Pizza,那么如果您需要更新一行,则可以执行使用单独的表格。另一个优点是翻译,你可以使用另一个表来存储不同语言的字符串翻译,并根据当前语言选择一个。
但这种方法的问题在于插入物。你需要在两个表中插入并且还需要维护外键约束,因此它为一个简单的表增加了一些复杂性。
答案 3 :(得分:1)
拥有单独的“字符串”表的优点:
缺点:
但实际上这真的很有效。例如。大多数全文搜索引擎几乎都使用这种方法来存储文档字图。