c# - SQL 良好实践和外键

标签 c# sql

我必须创建一个数据库结构。我有一个关于外键和良好实践的问题:

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

设计这张表的最佳方式是什么:

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

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

public enum StringAllowedValues
{
    A = 1,
    B
}

3) ???

预先感谢您的宝贵时间。

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

最佳答案

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

然而...

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

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

第二个是:应用程序需要推理此列中的值,其方式可能超出“A”或“B”。例如,“A”可能比“B”更大/更旧/更贵,或者您想要向最终用户展示 A 的某些其他属性,或者 A 是某些内容的简写。

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

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

关于c# - SQL 良好实践和外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40468767/

相关文章:

用于灵活且可配置属性的 SQL 模型

c# - 从 azure 函数运行 azure 存储过程

c# - 缺少使用指令或程序集引用 WPF 和 XAML

c# - 如何检索 outlook 联系人的图片

sql - 选择带有 charindex 问题

sql - 在 postgresql 中四舍五入列值

c# - 文件写入 3 次 C#

c# - 使用 Bouncy CaSTLe AES/CBC/PKCS7 加密字符串

sql - 强制 Oracle DB 中表的行子集具有唯一性

sql - 将一个表中的多列连接到另一表中的单列