5

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

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

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

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

4

7 回答 7

4

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

你需要这两个。一般来说,唯一约束不应该是照顾数据库的唯一因素。建议还使用外键约束,如果适用,还可以使用更复杂的数据验证(自定义约束)。但是,当您使用 MySQL 时,您真正可以使用的并不是很多

尽可能多地去做,因为最终它会避免很多令人头疼的尝试去弄清楚为什么会发生一个特定的错误,直到你最终意识到你的数据库中的数据是错误的。这真的很痛苦。

于 2013-03-03T19:24:54.037 回答
1

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

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

此外,您可能会在数据库上进行搜索过滤,因此在 MySQL 中您希望对电子邮件进行索引。因此,使该列独一无二并没有太大区别。

于 2013-03-03T19:25:49.590 回答
0

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

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

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

有关该主题的更多信息:mysql 5.0 索引 - 唯一与非唯一

于 2013-03-03T19:35:12.157 回答
0

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

于 2013-03-03T19:26:14.423 回答
0

通常,这是确定代码应该在哪里的情况。这是Dijkstra 的“关注点分离”的一个例子。

鉴于使字段唯一意味着您:

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 代码中抽象出来,这意味着您可以更改它而无需更改任何核心模型逻辑。

于 2013-03-03T19:26:32.230 回答
0

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

于 2013-03-03T19:28:35.537 回答
-2

然后有一天,您决定从 MySQL 切换到其他数据库,并且您的所有“验证”不再存在(例如切换到 MongoDB 之类的数据库)。

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

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

于 2013-03-03T19:32:41.427 回答