在不定义主键的情况下创建 SQL 数据库

Creating a SQL database without defining primary key

所以在我的工作环境中,我们不使用 SQL 服务器定义的 'primary key'。换句话说,我们不右键单击列和 select "set as primary key".

但是我们仍然有主键,我们只是使用一个唯一的 ID 列。在存储过程中,我们使用它们来访问数据,就像在任何关系数据库中一样。

我的问题是,除了在 SQL 服务器中定义主键所附带的内置功能,如 Entity Framework 等。是否有充分的理由使用 'primary key' 功能优于仅使用唯一 ID 列并在您自己的存储过程中使用该列访问您的表?

我看到的最大缺点(除了能够使用 Entity Framework 和类似的东西之外)是您必须在精神上跟踪或以其他方式跟踪哪些 ID 与哪些表相关。

我认为缺点是根本没有使用主键,而是对它不打算做的事情使用了唯一键约束。

唯一键:你可以有很多。它们旨在提供一种方法来确定行之间的唯一性。

主键:和汉兰达一样,只能有一个。它的预期用途是识别 table.

的行

我想不出有什么理由不使用主键。我的 意见 是,如果没有主键,您的 table 实际上不是 table。这只是一堆数据。

跟进:如果您不相信我,请查看这个问过一群 DBA 是否可以不使用主键的人。

Is it OK not to use a Primary Key When I don't Need one

你的问题有哲学和实践的答案。

实用 答案是使用主键约束强制执行 "not null" 和 "unique"。这可以保护您免受应用程序级错误的影响。

哲学的答案是,您希望开发人员在尽可能高的抽象级别上操作,这样他们就不必在尝试时将大脑塞满细节解决问题。

主键和外键是抽象概念,允许我们对底层数据模型做出假设。我们可以根据(业务)实体及其关系来思考。

在您的工作场所,您迫使开发人员根据表格、索引和约定进行思考。您不再考虑 "customers"、"orders" 和 "line items",而是考虑代表这些业务实体的软件制品和 "we always represent uniqueness by a combination of a GUID and unique index" 规则。在大多数应用程序中,这种心智模型已经足够复杂了;你只是让自己变得更难,尤其是在将新开发人员带入团队时。

"special" 没有关于 PRIMARY KEY 约束的内容。这只是一个唯一性约束,您可以通过使用 UNIQUE NOT NULL 语法来定义您的键来获得相同的结果。

但是,出于数据完整性的原因,唯一性约束(即一般的 ,而不是 "primary" 键)非常重要。他们确保您的数据是唯一的,这意味着可以从您的数据中得出明智、有意义的结果。从包含重复数据的数据库中获得准确的结果是极其困难的。此外,需要唯一性约束来强制表之间的引用完整性,这是数据完整性的另一个非常重要的方面。数据完整性不佳是一个数据管理问题,每年给企业造成数十亿美元的损失,这就是为什么密钥很重要的底线。

独特的 索引 很重要还有一个原因:查询优化和性能。唯一索引提高了查询性能。如果您的数据应该是唯一的,那么在其上创建一个唯一索引将使查询优化器有最好的机会为您的查询选择一个好的执行计划。