Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PostgreSQL中,主键的基本检查约束是否合理/必要?_Postgresql_Database Design_Check Constraints - Fatal编程技术网

在PostgreSQL中,主键的基本检查约束是否合理/必要?

在PostgreSQL中,主键的基本检查约束是否合理/必要?,postgresql,database-design,check-constraints,Postgresql,Database Design,Check Constraints,因此,我们使用postgres数据库作为整个后端。我们在各个列上有很多检查约束,以确保输入的任何数据都是有效的 但是,如何检查主键?postgres或SQL标准是否自动施加任何特定条件?在我看来,设置串行主键只有一个约束,即值必须是唯一的,但至少有一个一般原则,即ID大于零。这可以用一个约束覆盖,如 ALTER TABLE table_name ADD CONSTRAINT check_id_positive CHECK ( id > 0 ); 这在理论上是有道理的,但对我来说似乎有点过

因此,我们使用postgres数据库作为整个后端。我们在各个列上有很多检查约束,以确保输入的任何数据都是有效的

但是,如何检查主键?postgres或SQL标准是否自动施加任何特定条件?在我看来,设置串行主键只有一个约束,即值必须是唯一的,但至少有一个一般原则,即ID大于零。这可以用一个约束覆盖,如

ALTER TABLE table_name ADD CONSTRAINT check_id_positive CHECK ( id > 0 );

这在理论上是有道理的,但对我来说似乎有点过分了。有什么指导吗?同样,正如我所说的,我们希望在给定用例的情况下尽可能地最大限度地进行数据验证。我只是不确定这是否完全疯狂和过度。

你在寻求指导,而且你没有提供很多方法来评估建议,因此这是一个与其他任何东西一样多的意见

SQL和postgres只要求主键是唯一的。通常的做法要求它是不变的

除了主键的唯一性之外,向主键添加额外的约束是个坏主意——它将业务规则嵌入数据库的模式中,这些规则在本质上可能会发生更改。这就是为什么大多数人推荐自动生成的代理密钥-输入错误的风险更小哦,我切换了你的社会保险号码的两位数,或者业务变化我们现在允许两个人共享同一个社会保险号码,因为系统中有来自国外的人,并且不能保证加拿大社会保障号码与美国社会保障号码是唯一的

添加约束是因为有些东西看起来不合理——这会让你的数据库更难被那些不认同你的ick意识的人使用——那些可怜的前端开发人员现在不得不阅读更多的手册,试图找出为什么一个看起来非常合理的insert语句失败了

使用约束会有一个小的性能损失-这不应该是一个很大的问题,但仍然值得注意

最后,作为一般规则,我倾向于通过数据库机制强制执行关系逻辑——在外键表中不能找到null、unique,但要将业务逻辑留在数据库之外,必须大于0,至少包含1个数字和一个特殊字符,必须符合正则表达式


业务规则往往比我们想象的更不稳定,数据库模式更改比在数据库之外更改代码更危险

通常,您应该在数据库中强制执行尽可能多的相关规则,否则将违反这些规则。在数据库中使用声明性约束强制实现完整性比在某些应用程序或UI层中按程序进行要简单、可靠和高效得多。它甚至可以使查询更快,这取决于您的DMB在语义优化方面的熟练程度

更具体地说,您似乎在询问代理键上的约束,而不一定是主键。一个键是否是主要的与任何事情都没有什么关系,所以我建议你编辑你的问题

一般来说,对键或键列的约束当然是有效和有用的。如果您的DBMS支持用户定义的类型,则自然键通常具有特定的格式,应该在数据库中强制执行,最好作为类型约束

但代理键本身通常没有意义或结构,其唯一要求是其值必须唯一。它甚至没有任何逻辑上的理由成为一个整数;它可以是任何东西,尽管出于实际原因经常选择整数。因此,对于纯代理键,根据定义,除了惟一性和琐碎的类型约束(您的DBMS已经处理)之外,没有其他规则可强制执行

您希望强制实施正值ID的原因似乎是出于美学考虑,而不是基于现实世界的需求。如果您遇到一个零值或负值的id,是否会出现错误或不一致?如果是这样,请务必添加约束,但要记录对约束的需求。如果没有,就不要


最后一件事:如果曾经手动输入代理项键值,例如在某些UI中或在特殊查询中,则自动递增整数代理项是危险的。只需要一个简单的输入错误——省略、加法、换位——就可以识别出错误的元组。在这种情况下,您的代理id应该包括一个或多个检查数字/字符,以捕获大多数错误,当然不是所有此类错误;这些ID的有效性肯定应该通过约束进行检查。

如果主键列也是一个自动递增列,那么数据库不需要任何检查约束就已经在处理它了吗?生成的主键的实际值完全无关。我在那里
s对正数没有暗示或要求的限制-365464与生成的主键值一样好。ID大于零的一般原则。这是不必要的。ID为负或为零是可以的。但这可能是毫无意义的生意的一部分-rule@TimBiegeleisen是的,但前端团队将有权在表上插入操作,并且理论上可以指定一些负ID。大概他们不会,但我想为什么不让它尽可能防弹。我还可以限制他们指定ID,不过对于我们用于此的中间层,这会有点不太优雅。他们可以指定一个负ID。他们可以提供一个正ID。他们可以提供一个零ID。在大多数情况下,他们都不应该这样做。回答很好。在某些情况下,可以方便地在键的组件上暗示业务规则。在这种情况下,最佳实践是IMHO使用域,并参考这些域。看:这是非常危险的建议。您如何区分关系逻辑和业务逻辑?代理键如何比自然键更不容易出现输入错误?您是在声称在数据库外部强制执行完整性比在数据库内部执行完整性成本更低,还是说强制执行完整性要比不强制执行完整性受到性能的影响?你真的建议不要声明社会保险号码是唯一的吗?为什么数据库中编码的规则会发生变化?