2017-05-05 48 views
-1

DB在这里完全newb ...试图做简单的程序,以帮助我的地区周围的孤儿院。问题:假设我有表A和表B通过外键约束引用表C。如果表B中的元素Y已经引用了X,是否有办法阻止表A中的插入引用表C中的元素X?如果两个其他表之间的引用存在,如何将插入块阻塞到表中?

表A:空
表B:Y(参考X)
表C:X

尝试在表中插入Z(参考X)

表A:Z(参考X )< < ---阻止
表B:Y(参考X)
表C:X

对不起,我福利局问题,我第一次尝试用一个数据库......虽然我已经做了一些研究,但我甚至不知道放置搜索栏来寻找这种情况的适当条件。

+0

嵌入式sqlite – Mateus

+0

欢迎来到Stackoverflow!我认为你需要在这里了解一些理论。像依赖关系,参照完整性等。 – bonCodigo

+0

是@bonCodigo,我最近一直在阅读东西。我读过它,发现这个问题(处理独占子类型)是经常性的,没有“普遍接受的答案”。尽管我可能比平常的开发者挣扎更多,因为我不习惯db开发。现在看来我的问题是试图在sql中进行每个'db-to-reality-representation'一致性检查,并且不会对应用程序层使用这个负责任......这是另一场战争:业务逻辑应该在哪里......尽管我很想在sql中看到每个规则,猜测这不是要走的路... – Mateus

回答

0

我可能是错的,但对我来说,它看起来像你正试图解决错误的问题...

这听起来像表A和B是某种亚型的像学生和老师的相互关系......都是人

我会坚持给学生 - 在这里老师的例子,但它是所有其他实体一样,可都

所以这取决于你想拥有的关系,在被处理一个人的身份,无论是学生还是老师,都可以成为人表中的辨别器字段,告诉你哪种子类型一个人是,或者它可以是另一个具体关系的一部分,例如,如果你有一个人可以成为一个学生的情况,同时又是另一个教师的情况......(鉴别场会搬到描述的关系,使你得到每个具体关系一个鉴表)

在抽象世界与A,B和C也可能是这样的:

一个
[ A1]
[A2]


[B1]
[B2]

ç
[C1]

ř
[R1; C1; A1; NULL; A]

而对于R的列是:
PK
C基准
参考
B参考
鉴别器

并限制R限制列C ref是唯一的

独特的是防止不必要的额外引用你描述,并将阻止插入到R(不完全是你想要的,因为你仍然可以在A ...中的条目,但它会阻止额外的引用C实体已被引用,这很可能已经足够)

+0

感谢您的帮助。是的,这确实是一个子类型的问题......但是,你提出的解决方案将允许在R中插入[R1; C1,A1,B1,A]条目,这是不一致的......经过一番研究,我猜测我面临的问题是我试图把所有的业务逻辑和一致性维护放在SQL里面......而这可能需要大量的触发器,存储过程和函数......虽然这不是很简单纯粹的SQL,大多数这些东西更容易在使用DB的应用程序中实现,特别是如果DB不会被任何其他应用程序使用... – Mateus

+0

@Mateus ...取决于您的DBMS,这可以在一个完全简单的方式...你可以有一个触发器,在插入/更新时设置R的所有参考列中的一个为NULL,或者如果只有正确的参考列被填充,那么就有TSQL的CHECK约束测试 – DarkSquirrel42

相关问题