2011-03-04 41 views
0

背景在SQLite数据库中,最好使用tirggers来处理级联表更改,还是更好地以编程方式执行?

我有几个使用SQLite数据库的项目。存储在数据库中的数据显然存储在多个表中,通过键/外键值链接。

问题是,在这些数据库中,如果某个记录发生某些变化,我必须更新其他几个表。我头上最好的例子就是删除一条记录。我必须确保与删除的记录相关的所有其他记录也被删除。现在,我相信这个例子可以使用键/外键值来解决,但更复杂的更新呢?

现在我不是亲数据库管理员,但我知道需要数据库中的数据完整性或事情变得丑陋。

问题

所以,我的问题。我知道在以编程方式更新相关表格时我有更好的控制权,但是以人为错误和时间为代价。我可能会错过某些东西,或者没有正确实施表更新,并且需要更长的时间来编写更新。另一方面,我可以放入触发器并让DB处理其他表的更新,但是然后我失去了很多控制权。

那么,哪一个更好?在不同的情况下每种都更好吗?

+0

没有你考虑使用'ON DELETE CASCADE'在FK定义?如果正确实施,触发器允许您拥有始终一致的数据库。但是这些并不是很容易正确实施,触发器通常没有多少操作空间。如果级联要求简单明了,我会尝试'ON DELETE'并且首先触发方法。 – 9000 2011-03-04 15:43:10

+0

正如我在我的问题中提到的,我知道我给出的例子可以用k/fk来解决,但我想知道更复杂的表更新,就像“名称”列(不是关键字)发生更改一样在别处改变。与键无关的东西。 – 2011-03-04 15:59:32

回答

1

在另一方面,我可以把 触发器,让DB处理 更新其他表,但后来我 失去了很多控制。

你认为你失去了什么控制权?如果数据完整性要求“这样的更新这里需要额外的更新那里那里”,你不失去控制,通过在触发器中编码。您正在集中控制,并将其委派给dbms,这是唯一能够保证每个应用程序遵循这些要求的软件。

我知道我有更大的控制权 更新相关表 时编程,但在 人为错误和时间成本。我可能会错过 某些东西,或者没有正确执行表 更新,并且需要较长时间才能更新代码。

你在想像一个程序员,而不是数据库设计师。 (这是一个观察,而不是批评。)不要想,“我可能会错过什么”。这种思维方式真的让人失望。相反,当您试图将数据完整性委托给应用程序代码时,请考虑“从现在开始直到时间结束时,每个程序员和每个新的或更改的应用程序都需要完全正确地访问此数据库”。

现在,说实话,真的是听起来对你来说是个好主意吗?

(最后的财富500强公司,我曾在写方案,至少两打不同的语言击中他们的OLTP数据库。)

+0

+1“从现在开始直到时间结束时,每个程序员和每个新的或更改的应用程序都必须使它完全正确。” – 2011-03-15 22:36:01

相关问题