是否应在数据库级别处理唯一字段的验证?

时间:2013-03-03 19:18:23

标签: php mysql sql validation

我正在为我的BSc项目编写一个很大的Web应用程序,并使用MySQL在PHP中编写它。

创建SQL表时,我应该使用唯一字段吗?我问这个的原因是因为我在我的PHP中编写了验证方法。例如,如果我想检查数据库中是否已存在电子邮件地址,我将首先发出一条SQL语句,查看是否返回了任何电子邮件地址,然后将初始SQL数据插入数据库。

如果我只是插入初始SQL数据,则会在整个语句中引发错误,因为电子邮件地址必须是唯一的。

这是接近验证的正确方法吗?

7 个答案:

答案 0 :(得分:2)

嗯......这是完全不同的两件事。通过在数据库中的列上设置约束(如唯一),可以防止将错误的数据集插入到数据库中。这是确保数据一致性的基本要素。通过向应用程序添加验证,您可以添加另一个层。虽然防止将错误的数据集插入到数据库中,但主要是创建一种方法来告诉用户他做错了什么。

你需要这两个。通常,唯一约束不应该是处理数据库的唯一事情。建议还使用外键约束,如果适用,还要使用更复杂的数据验证(自定义约束)。但是,当您使用MySQL时,并没有很多真正可用的

尽可能多地获取,因为最终它会阻止很多令人头疼的问题,试图弄清楚为什么会发生特定错误,直到您最终意识到数据库中的数据是错误的。这真的很痛苦。

答案 1 :(得分:1)

我不推荐这种方法,因为只有数据库约束才能保证您的唯一性

如果有2个请求并行运行,则两个请求都可以接受相同的电子邮件地址,并且您有2个用户具有相同的电子邮件地址。

此外,您可能会对数据库进行搜索过滤,因此在MySQL中您希望在电子邮件中添加索引。所以,那个专栏没有多大区别。

答案 2 :(得分:0)

是的,数据库应检查数据是否正确。数据库保存数据,无论他们如何到达那里有时您可能会使用其他应用程序中的数据库,此应用程序也需要验证数据。检查应用程序(前端和后端)和数据库级别的数据是否正确更安全。

答案 3 :(得分:0)

通常,这是一个解决代码应该的地方的情况。这是Dijkstra's "Separation of Concerns"的一个例子。

鉴于将字段设为唯一意味着您:

Don't need to write validation code, ergo ultimately you write less code

The validation for values in the database, is in a logical place; bound to the database!

这是数据建模的问题。简单地问问自己“这个代码在哪里有意义?”。在我看来,使用数据库中的唯一值是正确的方法。它将验证从PHP代码中抽象出来,这意味着您可以在不必更改任何核心模型逻辑的情况下对其进行更改。

答案 4 :(得分:0)

验证应该在客户端(例如javascript)执行,因为它通常会提供更好的用户体验。它应该用于服务器端,因为客户端可以被绕过。并且应该在数据库上强制执行,因为任何未在数据库上强制执行的约束都不是约束......这只是一个建议。

答案 5 :(得分:0)

在电子邮件地址字段上创建 UNIQUE 约束是最佳方法,因为它具有高选择性,但请确保您还将字段设置为 NOT NULL

我发现使用约束会好很多,但您也可以通过查询来完成,例如:

SELECT COUNT(*) FROM table WHERE email = '$email'

有关此主题的更多信息:mysql 5.0 indexes - Unique vs Non Unique

答案 6 :(得分:-2)

然后有一天你决定从MySQL切换到其他数据库以及所有的"验证"不再存在(例如切换到像MongoDB这样的数据库)。

请不要这样做 - 在应用程序级别执行此操作。它简单,版本控制,可测试等。

无论如何 - 在MySQL中创建您的唯一索引,但我不会单独依赖它。