在方向无关的自反多对多关系中避免重复
Avoiding duplicates in a reflexive many to many relationship where direction is irrelevant
给定一个 table users( #user_id )
和一个 table 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?
- 理论只有在有实际应用的时候才有价值(不允许实践的理论,或者脱离实践的理论都是无效的,就是猪屎。通常被称为空想。
- 关系数据库的理论是 Dr E F Codd 的关系模型
- 当心,有很多伪装者,他们对 关系模型 有奇怪而奇妙的想法,因此准确地说,他们有自己的版本"relational theory" 和 "relational"。可能最好称它们为反关系。
- 理论有
CONSTRAINTs
。唯一性是 CONSTRAINT
的一种形式。 CHECK
是 CONSTRAINT
的一种形式。没有要求的CONSTRAINTS
,理论就是猪粪。
- 反关系理论对数据库需要什么的理解非常有限,因此
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?
准确的说,那不是"relationship",而是对关系的约束
在 DDL 级别,您需要一个 CHECK CONSTRAINT
来调用函数。几十年来,这一直是 SQL(关系模型 的数据子语言)的一个普通特征。函数代码为:
...
IF NOT EXISTS (
SELECT 1
FROM user_related
WHERE related_user1 = @related_user2
AND related_user2 = @related_user1
)
...
- 小心,在免费软件中;蒸气器皿;不知道类别,他们使用术语 SQL,但没有 SQL 的特征。他们使用该术语是欺诈性的。有些没有
CONSTRAINTS
;有些没有 CHECK
(或者更糟,允许关键字但不执行检查);有些没有功能;或可以从 CHECK
调用的函数。
如果您需要 SQL 兼容的代码示例,请询问。
关系数据库
users( #user_id )
这不会为您提供唯一的用户行(数据)。这为您提供了用户文件中的唯一记录,这不是唯一的用户。 Relational Model 是合乎逻辑的,它要求 Key 由数据构成,这与 1960 年代 "theoreticians" 提倡的使用物理记录的 Record Filing 系统相反,不是逻辑行。
对于关系型数据库,需要在构成用户的数据上具有唯一性,Key如user_name
; social_security_no
; (name_last, name_first, initial)
,等等。然后你可以去掉record iduser_id
,因为它是多余的,没有任何用处。
在每个文件中以 ID
开头将确保您拥有一个反关系的 1960 年代记录归档系统。当然,这就是 "theoreticians" 提倡的。
给定一个 table users( #user_id )
和一个 table 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?
- 理论只有在有实际应用的时候才有价值(不允许实践的理论,或者脱离实践的理论都是无效的,就是猪屎。通常被称为空想。
- 关系数据库的理论是 Dr E F Codd 的关系模型
- 当心,有很多伪装者,他们对 关系模型 有奇怪而奇妙的想法,因此准确地说,他们有自己的版本"relational theory" 和 "relational"。可能最好称它们为反关系。
- 理论有
CONSTRAINTs
。唯一性是CONSTRAINT
的一种形式。CHECK
是CONSTRAINT
的一种形式。没有要求的CONSTRAINTS
,理论就是猪粪。- 反关系理论对数据库需要什么的理解非常有限,因此
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?
准确的说,那不是"relationship",而是对关系的约束
在 DDL 级别,您需要一个 CHECK CONSTRAINT
来调用函数。几十年来,这一直是 SQL(关系模型 的数据子语言)的一个普通特征。函数代码为:
... IF NOT EXISTS ( SELECT 1 FROM user_related WHERE related_user1 = @related_user2 AND related_user2 = @related_user1 ) ...
- 小心,在免费软件中;蒸气器皿;不知道类别,他们使用术语 SQL,但没有 SQL 的特征。他们使用该术语是欺诈性的。有些没有
CONSTRAINTS
;有些没有CHECK
(或者更糟,允许关键字但不执行检查);有些没有功能;或可以从CHECK
调用的函数。
如果您需要 SQL 兼容的代码示例,请询问。
关系数据库
users( #user_id )
这不会为您提供唯一的用户行(数据)。这为您提供了用户文件中的唯一记录,这不是唯一的用户。 Relational Model 是合乎逻辑的,它要求 Key 由数据构成,这与 1960 年代 "theoreticians" 提倡的使用物理记录的 Record Filing 系统相反,不是逻辑行。
对于关系型数据库,需要在构成用户的数据上具有唯一性,Key如user_name
; social_security_no
; (name_last, name_first, initial)
,等等。然后你可以去掉record iduser_id
,因为它是多余的,没有任何用处。
在每个文件中以 ID
开头将确保您拥有一个反关系的 1960 年代记录归档系统。当然,这就是 "theoreticians" 提倡的。