【问题标题】:What would be proper schema for the following situation?以下情况的正确模式是什么?
【发布时间】:2014-04-11 15:45:24
【问题描述】:

我需要创建一个数据库表,其中我主要有以下三个字段:

  1. ID(默认自动递增)。
  2. User_id(从1000开始,自动递增)
  3. 电子邮件

所以,我想将 Email 设置为唯一,而不是 null(主键),但我还想确保 User_id 保持唯一(可以通过设置唯一键来解决),我也希望它永远不会设置为空。那么,我该如何实现呢?我正在使用 MySQL 顺便说一句。

PS:目前我对这个架构构建不太擅长。所以,忽略任何愚蠢的错误。

【问题讨论】:

  • 为什么要将电子邮件作为主键?以 ID 作为主键不是更好吗?
  • @Fred 电子邮件将由用户输入,所以我希望它是唯一的并且永远不会为空,所以,,,
  • 您不必将其作为主键来实现这一目标。
  • @Fred 那么我如何才能使我的电子邮件独一无二(虽然我可以在输入电子邮件之前以编程方式检查,但在 db 中仍然存在任何其他方式)
  • 在下面我的答案中创建表格后的两行中的任何一行都可以防止重复。如果您尝试输入重复的 SQL,则会引发错误。但是,为了获得更好的用户体验,请检查他们输入的电子邮件,如果他们输入了重复的电子邮件,请在点击提交之前让他们知道。

标签: mysql sql database-design


【解决方案1】:

我会选择这样的东西

CREATE TABLE USERS
(
        ID INT PRIMARY KEY AUTO_INCREMENT,
        User_Id INT AUTO_INCREMENT = 1000,
        Email VARCHAR(250) NOT NULL
)

然后

ALTER TABLE USERS ADD UNIQUE (Email)

或者如果您打算在电子邮件字段中搜索

CREATE UNIQUE INDEX inx_users_email ON USERS  (Email)

您最好使用 Id 字段作为主键。 PK 并不意味着更改,而是用于标识记录。如果您的用户更改电子邮件地址会怎样?

【讨论】:

  • ,用户会在我的应用程序中更改电子邮件的情况非常罕见,但我仍然希望当我将电子邮件作为我的 pk 并且用户经常更改它时,这会产生什么影响
  • 如果您使用电子邮件作为主键然后更改它,您将必须更新通过主键标识该记录的所有内容。我的名字是弗雷德,这是我所有的朋友和家人都知道我的名字。想象一下,有一天我决定称自己为哈利,我将不得不告诉所有认识我的人我的名字已经改变,否则他们不会知道哈利是谁。一样的东西。如果您使用 Id 作为您的 PK,您可以随意更改电子邮件,因为记录由 Id 标识。
【解决方案2】:

Auto_INCREMENT 确保列具有唯一值并且永远不能为空。

【讨论】:

    猜你喜欢
    • 2018-06-01
    • 2014-12-22
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多