Database 我是否应该使用外键

Database 我是否应该使用外键,database,database-design,Database,Database Design,假设我想创建一个数据库来存储用户的登录名和个人详细信息,那么我是否应该创建一个表 Only One table Table User Username(varchar255)|User_id(int)|Name(varchar255)|Sex(0,1,2)|DOB(Date)|Password(char64)| 或带有外键的两个表 Table User_Login User_id(int)|Username(varchar255)|Password(char64)| and tab

假设我想创建一个数据库来存储用户的登录名和个人详细信息,那么我是否应该创建一个表

Only One table Table User
Username(varchar255)|User_id(int)|Name(varchar255)|Sex(0,1,2)|DOB(Date)|Password(char64)|
带有外键的两个表

Table User_Login

    User_id(int)|Username(varchar255)|Password(char64)|

and table User_Detail

    User_id(int)|Name(varchar255)|Sex(0,1,2)|DOB(Date)|

问问自己这些问题

用户是否有一个或多个用户名

用户是否有一个或多个密码?如果要在一段时间内检查唯一的密码,这包括以前的密码

用户会有一个或多个名称吗

用户是否有一种或多种性别

用户是否有一个或多个出生日期

当问题的答案为“一”时,该列属于用户表

当一个问题的答案是“不止一个”时,该列属于另一个表


这个过程被称为表的第一范式。

我认为有两种常用的定义表的方法,3NF和BNCF(它们将被很好地记录)

这些规则是:

  • 不应该有重复的列(简单的一个)
  • 删除不完全依赖主键的列(查看属性,如果它们单独存在时有意义,那么它们应该位于单独的表中(类似于这样)

第一次很难理解,所以读一读1NF、2NF、3NF和BNCF,你觉得怎么样,为什么呢?我不是db专家,所以我在评论中发表了我的观点:如果你有1-1关系,我认为做外键是没有意义的,因为你需要做一些无用的连接,然后进入证人保护程序并获取多个出生日期,然后尽一切可能使用2表结构。@LightnessRacesinOrbit我认为第一个是因为它将减少数据库大小,但不确定我的登录查询是否仍然快速查询速度几乎与表中的字段数无关,除非您一个懒惰的程序员,只做过
select*
。但是
selectonefieldfrom…
无论有500个字段还是2个字段,速度都是一样的。根据你的回答,从来没有理由使用1-1表,如果你想避免空列(对于“更高”的标准形式来说是必要的),那么实际上需要使用1-1表@兰登:你在描述第四范式。让我们先过第一、第二和第三范式。:-)很公平;)。我对上面的评论有点惊讶,说1-1是没有意义的。@landons:OP的1-1可能是没有意义的。不通过第一个标准形式的问题就无法知道。例如,我将用户名和密码放在单独的表中,因为我希望允许更改用户名并检查密码的唯一性。然后,我的用户表将与我的用户名表和密码表有1-N关系。