SQL良好做法和外键

时间:2016-11-07 15:26:48

标签: c# sql

我必须创建一个数据库结构。我有一个关于预备钥匙和良好做法的问题:

我有一个表必须有一个字段,可以是两个不同的字符串值,“A”或“B”。 它不能是其他任何东西(因此,我不能使用字符串类型字段)。

设计此表的最佳方法是:

1)创建一个int字段,它是另一个只有两条记录的表的外键,一个用于字符串“A”,另一个用于字符串“B”

2)创建一个int字段,然后在我的应用程序中创建一个枚举,例如这个

public enum StringAllowedValues
{
    A = 1,
    B
}

3)???

提前,谢谢你的时间。

编辑:13分钟后,我得到了所有这些令人敬畏的反馈。谢谢大家的想法和见解。

2 个答案:

答案 0 :(得分:3)

许多数据库引擎支持枚举作为数据类型。事实上,枚举是正确的设计解决方案。

...然而

有两个要求可能决定单独表的外键更好。

第一个是:可能需要增加该列中有效选项的数量。在大多数情况下,您希望在没有软件部署的情况下执行此操作;枚举是“烘焙”的,因此在这种情况下,您可以在其中编写新数据的表格效率更高。

第二个是:应用程序需要以超出“A”或“B”的方式推断此列中的值。例如,“A”可能比“B”更大/更旧/更昂贵,或者您希望向最终用户呈现A的某些其他属性,或者A是某些东西的简写。

在这种情况下,最好将其显式建模为表格中的列,而不是将这些知识烘焙到您的查询中。

在使用数据库的30年中,我个人从未发现一个枚举是正确决定的案例......

答案 1 :(得分:0)

创建具有这些整数代码含义的辅助表。没有什么可以迫使你JOIN进入,但如果你需要那些数据。在您的C#代码中,您仍然可以使用enum查找内容,但尝试将其与数据库中的内容保持同步,反之亦然。其中一个应该具有权威性。

在实践中,您经常会发现短字符串比刚性枚举更容易使用。在20世纪90年代,当计算机速度很慢且磁盘空间不足时,你已经做这样的事情以获得合理的性能。现在,即使在拥有数亿行的表格上,它也不是真正的问题。

相关问题