SQL良好实践和外键

本文关键字:SQL | 更新日期: 2023-09-27 18:16:37

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

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

设计此表的最佳方法是什么:

1( 创建一个int字段,它是另一个只有两条记录的表的外键,一条用于字符串"a",另一条用于"B">

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

public enum StringAllowedValues
{
    A = 1,
    B
}

3( ???

提前,谢谢你抽出时间。

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

SQL良好实践和外键

许多数据库引擎都支持枚举作为一种数据类型。事实上,在某些情况下,枚举是正确的设计解决方案。

然而。。。

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

第一个是:可能需要增加该列中有效选项的数量。在大多数情况下,您希望在没有软件部署的情况下完成此操作;枚举是"烘焙"的,所以在这种情况下,可以向其中写入新数据的表要高效得多。

第二个问题是:应用程序需要对该列中的值进行推理,推理方式可能超出"A"或"B"。例如,"A"可能比"B"更大/更老/更贵,或者你想向最终用户展示A的其他属性,或者A是某种东西的短缺。

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

在30年的数据库工作中,我个人从未发现枚举是正确的决定。。。。

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

在实践中,您经常会发现短字符串比刚性枚举更容易处理。在20世纪90年代,当计算机运行缓慢,磁盘空间稀缺时,必须这样做才能获得合理的性能。现在,即使在具有数亿行的表上,这也不是一个真正的问题。

相关文章:
  • 没有找到相关文章