给定一个表 users( #user_id )
和一个表 user_related( #related_user1, #related_user2 )
其中只有两个用户之间关系的存在是相关的,因此如果 user_related 中存在作为 (1, 2) 的行,则 (2, 1) 行将是多余的:
从理论上而非实际的方式思考:是否有可能以一种不需要约束或检查的方式来实现这种关系?当交换 ID 的关系已经存在时,试图在两个用户之间插入关系会违反数据完整性吗?
实用:实现和查询所述关系的最佳方式是什么?
最佳答案
简单。但首先,要澄清您的一些误解。
Thinking in a theoretical, non practical way: is it possible to implement this kind of relationship in a way that no constraint nor check is needed?
- 理论只有在有实际应用时才有值(value)(不允许实践的理论,或者脱离实践的理论都是无效的,就是 pig 屎。通常被称为幻想。
- 关系数据库的理论是 E F Codd 博士的关系模型
- 当心,有很多伪装者,他们对什么是关系模型有奇怪而奇妙的想法,因此准确地说,他们有自己版本的“关系理论”和“关系”。可能最好称它们为反关系。
- 理论有
CONSTRAINTs
。唯一性是CONSTRAINT
的一种形式。CHECK
是CONSTRAINT
的一种形式。如果没有所需的CONSTRAINTS
,该理论将成为 pig 粪。- 反关系理论对数据库需要什么的理解非常有限,因此
CONSTRAINTS
要少得多。
- 反关系理论对数据库需要什么的理解非常有限,因此
data integrity
数据完整性无疑是关系模型理论的一部分。数据完整性是目标,它预示着对各种CONSTRAINTS
的需求。如果没有 CONSTRAINTS
,您根本无法获得数据完整性。
In a way in which trying to insert a relation between two users when a relationship with swapped IDs already exists violates data integrity?
该理论提供了这样的约束,当然使用 CONSTRAINT
。
Being practical: Which is the best way to implement and query said relationship?
准确的说,那不是“关系”,而是对关系的约束。
在 DDL 级别,您需要一个调用函数的 CHECK CONSTRAINT
。几十年来,这一直是 SQL(关系模型 的数据子语言)的一个普通功能。函数代码为:
... IF NOT EXISTS ( SELECT 1 FROM user_related WHERE related_user1 = @related_user2 AND related_user2 = @related_user1 ) ...
- 当心,在免费软件中; Vapor 器皿; noware 类别,他们使用术语 SQL,但没有 SQL 的特性。他们使用该术语是欺诈性的。有些没有
CONSTRAINTS
;有些没有CHECK
(或者更糟,允许关键字但不执行检查);有些没有功能;或可以从CHECK
调用的函数。
如果您需要符合 SQL 的代码示例,请询问。
关系数据库
users( #user_id )
这不会为您提供唯一的用户行(数据)。这为您提供了用户文件中的唯一记录,这不是唯一的用户。 Relational Model 是合乎逻辑的,它要求 Key 由数据构成,这与 1960 年代由“理论家”提倡的使用物理记录而不是逻辑行的记录归档系统相反。
对于关系型数据库,你需要在构成用户的数据上具有唯一性,一个Key比如user_name
; social_security_no
; (name_last, name_first, initial)
等,然后可以去掉record id user_id
,因为它是多余的,没有目的。
在每个文件中以 ID
开头将确保您拥有一个反关系的 1960 年代记录归档系统。当然,这是“理论家”所提倡的。
关于database - 在方向无关的自反多对多关系中避免重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57621875/