0

我有 3 列:

-> person(varchar(50))
-> related_with(varchar(50))
-> relationship(varchar(50))

以上3个组合为主键

现在,例如,将值赋予 3 列:

person -> User
related_with -> User1
relationship -> Son of

问题是,如果我将值添加为

person -> User1
related_with -> User
relationship -> Son of 

然后它被成功插入..但这不应该是这种情况,因为在这种情况下反之亦然

这个问题有解决办法吗??

4

2 回答 2

1

使 (person, related_with) 成为关键。像“兄弟”这样的相互关系是隐含的,因此您不一定需要两行来表示它们。现在您可以添加一个 CHECK 约束:

ALTER TABLE tbl ADD CONSTRAINT ck1 CHECK (person <related_with);

对于每种关系来说,这并不是一个完美的解决方案,但它确实减少了冗余量和潜在异常的数量,并且它以声明的方式执行规则,而不是作为触发器中的程序代码。

于 2012-08-24T02:50:54.650 回答
1

大多数时候,应在应用程序代码级别进行此类验证。但是,如果您必须在数据库中执行此操作,请考虑编写触发器

这确实是一个复杂的逻辑和验证(在应用程序或触发器中)。可能有多种情况: 1. 考虑一个relationship -> friend of. 这里相反的关系成立,不像son of

  1. 考虑一个relationship -> brother of. 在这种情况下,如果两个用户都是男性,则相反的关系是可能的,但如果用户是女性,则不是。同上relationship -> sister of

因此,您需要仔细设计一种存储查找关系的方式,以及是否要加强逻辑或使用标志来识别关系类型。

于 2012-08-23T10:29:08.193 回答