我正在开发一个具有一些数据关系的iPhone应用程序(例如,作者 - >书籍)。当用户从应用程序中删除Author对象时,我会在删除时运行一些SQLite触发器,以从数据库中删除任何具有与Author的主键匹配的外键的书籍。
我还在创建新项目时使用触发器插入一些数据。
我情不自禁地感觉这可能是糟糕的设计,或者导致我想不到的一些问题。也就是说,当数据库具有内置的处理能力时,我应该依赖我的应用程序中的代码来处理传播这样的删除吗?
你说什么?
答案 0 :(得分:2)
真。尽可能使用数据库的内置功能。 Atleast尝试并开始这样做,只有当真正要求时才会妥协。
答案 1 :(得分:1)
我会利用数据库的功能来确保关系完整性,尤其是在更新/删除方面。在某些情况下,我可能会使用触发器来插入一些额外的数据(想到审计),但我倾向于避免这种情况并插入我的应用程序中的所有数据。但是,如果要进行多次插入,请确保将其全部包装在一个事务中,这样就不会导致部分插入,从而导致关系完整性丢失。
答案 2 :(得分:1)
我喜欢使用数据库内置功能的想法(我不熟悉它是如何工作的)..但是如果我从现在起回到代码我会担心,我会记得它是如何工作的吗? (鉴于代码不在我面前)。
我想如果你添加了很多注释来提醒自己它现在是如何工作的,如果将来出现任何问题,至少你不需要在需要进行调试时重新学习数据库功能。
答案 3 :(得分:1)
你领先我几步:我最近学会了如何使用触发器做这些事情,我很想自己使用它们。
基于此处的其他答案,这似乎是一种哲学选择。使用触发器或代码可能会很好,但最好保持一致。所以不要在一个表上使用触发器进行级联删除,而是在另一个表上使用C代码。
由于您标记了iphone的问题,我认为最重要的区别是C代码与触发器的相对性能。您可能需要对两者进行编码并进行实验以确定差异(如果有的话)。
我想到的另一件事是,在thedailywtf.com上阅读的所有恐怖故事中,大约有一半似乎涉及数据库触发器。
答案 4 :(得分:0)
不幸的是,SQLite不支持删除级联等。来自SQLite文档:
http://www.sqlite.org/omitted.html
解析FOREIGN KEY约束但不强制执行。但是,可以使用触发器实现等效约束实施。 SQLite源代码树包含C程序的源代码和文档,它将读取SQLite数据库,分析外键约束并自动生成适当的触发器。
对触发器有一些支持,但它并不完整。缺少的子功能包括FOR EACH STATEMENT触发器(当前所有触发器必须为FOR EACH ROW),表上的INSTEAD OF触发器(当前仅允许在视图上使用INSTEAD OF触发器),以及递归触发器 - 触发自身的触发器。
因此,使用SQLite对删除级联等进行编码的唯一方法是需要触发器。 亲切的问候,
答案 5 :(得分:-1)
代码进入你的应用程序。
触发器是代码。该功能适用于您的应用。不在数据库中。
我认为数据库应该用于数据,而不是处理。我认为应该使用应用程序进行处理,而不是数据。
数据库处理功能只会使水变得混乱。