我有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
然后它被成功插入..但不应该是这种情况,因为在这种情况下反之亦然是真的
这个问题有解决方案吗?
答案 0 :(得分:1)
大多数情况下,此类验证应在应用程序代码级别进行。但是,如果您必须在数据库中执行此操作,请考虑编写trigger。
这确实是一个复杂的逻辑和验证(在应用程序或触发器中)。可能有各种情况:
1.考虑relationship -> friend of
。这里的反向关系与son of
不同。
relationship -> brother of
。在这种情况下,如果两个用户都是男性,则可以是反向关系,但如果用户是女性则不可以。同上relationship -> sister of
。因此,您需要仔细设置一种存储方式以查看您的关系,以及您是否想要硬化逻辑或使用标记来识别关系类型。
答案 1 :(得分:1)
使(person,related_with)成为关键。像“兄弟”这样的相互关系是隐含的,因此您不一定需要两行来表示它们。现在您可以添加CHECK约束:
ALTER TABLE tbl ADD CONSTRAINT ck1 CHECK(person< related_with);
对于各种关系来说,这不是一个完美的解决方案,但它确实减少了冗余的数量和潜在的异常数量,并且它以声明方式强制执行规则,而不是作为触发器中的过程代码。