我对数据库编程比较陌生,我发现SQL的编码方面非常直观。通过编码,我的意思是,例如,在列中查找单个字符串值并将其大写,将其与另一个值连接,根据引用它的另一个表修改它,等等。
我的问题是,在数据库级别或应用程序级别执行管理数据的规则是否更好,以及原因。例如,This article(请参阅通过应用程序强制执行完整性),认为应该在数据库级别强制执行。
以下是两个例子,一个是显而易见的,另一个是复杂的。
如果我们有一个简单的Person表,那么
CREATE TABLE Person(
id SERIAL,
age INT CHECK (age>=0)
);
在数据库级别强制执行非负年龄是有意义的。但是,如果我们有一个更复杂的例子,那么
CREATE TABLE Person(
id SERIAL,
age INT CHECK (age>=0),
spouse INT REFERENCES Person (id)
);
确保
需要更复杂的触发器。或者,当使用更多人类可读的语言(如PHP或Python)添加到数据库时,可以检查这些内容。如果只为一个程序构建数据库,那么在数据库级别强制执行这些规则是否可以接受?
答案 0 :(得分:1)
在设计数据库和应用程序时,这是一个至关重要的设计问题。有些事情要考虑:
我倾向于将验证应用程序和完整性约束(a.k.a外键约束)放入数据库中。我将验证放入应用程序中,以便告诉用户他们的输入有什么问题。我认为完整性约束在数据库级别至关重要,因为您不可避免地需要进行某种手动数据库更新来纠正问题,添加新功能等等。这些约束可以保护您免受这些手动更新中的错误以及应用程序逻辑中的错误的影响。