在数据库上重复相同的最佳实践

时间:2021-06-24 09:23:12

标签: sql sql-server

我正在开发一个新的数据库,它有 30 多个带有标准值的表,例如,其中一个存储车辆信息,其中一个字段是 fuel,这将始终是“汽油”或“柴油”选项。

这里的问题是这个数据库将有超过 50,000 辆汽车,所以如果其中 50% 是汽油,我将有 25,000 行重复相同的“汽油”值。

考虑到“汽油”有 8 个字节,“柴油”有 6 个字节。 如果我将每一行的值存储为带有燃料名称的 varchar(8),那么总共 50,000 条记录将达到 200KB + 150KB = 350KB。如果我将其存储为 char(1) 并指定“Gasoline”= 1 和“Diesel”= 2,则总大小将减少到 50KB。

在这种情况下做什么最好?

  1. 创建“list_fuel_names”表并创建表之间的关系;
  2. 在服务器上处理值,如 if fuel=1 echo "Gasoline" else if fuel=2 echo "Diesel"
  3. 使用 varchar(8) 在字段中保存燃料名称

任何其他选项都可供讨论和赞赏。 最好的问候。

编辑 1:我还有一个“Persons”表,其中性别用 char(1) 值存储,我没有任何“list_gender”表,所以我会在后端代码中解码。

编辑 2: 由于有 30 多个表存在相同的问题,我必须创建 30 多个表才能列出值,这是否有效?我这么问是因为最后我可以使用更多的空间,如果我在 varchar 列中写入值。

1 个答案:

答案 0 :(得分:1)

这是一个复杂而微妙的问题。归结为“你想优化什么?”。

首先,除非在非常的情况下,我不会优化磁盘空间。您输入此问题所花的钱比存储 350KB 所花的钱还多。

你有几个选择。

“将属性存储为字符串”是最简单的,也非常具有表现力——你可以问“查找所有柴油车”等等。缺点是你需要一种机制来验证这些字符串——它们必须是柴油或汽油,没有错别字。此逻辑会在您的应用程序中传播,更改它(您好,电动汽车!)可能会很麻烦。

“将属性存储为外键关系”避免了拼写问题,通常被认为是最佳实践。你有一个“fuel_types”表,你的“vehicle”表有一列叫做fuel_type,有一个fuel_types的外键;数据库确保只接受有效的条目。如果您删除燃料类型,数据库可以确保您没有孤立的项目。如果您需要围绕燃料类型引入更多逻辑,例如“tax band”或“supplied_by”,你可以扩展你的fuel_types表。缺点是您需要为数据库访问编写更多代码 - 选择所有车辆时需要更多连接。

“将属性存储为枚举”避免了字符串的一些问题 - 枚举确保您只存储有效选项,并且您可以在新燃料类型可用时扩展枚举。阅读您的架构的人会立即看到只有有限数量的选项。如果您没有预料到有关燃料类型的任何其他逻辑,这是一个不错的解决方案。

“将属性存储为魔法字符串”是一个非常糟糕的解决方案——你有很多代码需要维护,很多地方你需要确保“D”=柴油,还有人阅读你的模式不知道会发生这种情况。

相关问题