【问题标题】:Database design 1 to 1 relationship数据库设计1对1关系
【发布时间】:2013-09-08 08:36:57
【问题描述】:

我的数据库设计不正确,我应该在开发过程中解决这个问题吗?

“user”表假设与“userprofile”表有1.1的关系

然而,“user”表的实际设计与“userprofile”表具有 1.* 关系。

一切正常!但无论如何都应该修复它吗?

【问题讨论】:

  • 是的,你可以......主键和外键适应得很好,然后它就可以工作了。

标签: sql-server database-design


【解决方案1】:

做一件事

User Table 
   Userid(p)
   UserName
   othercol..

UserProfile 
   id(p)
   UserId(f) - and unique
   othercol..

希望这样你可以轻松解决问题

【讨论】:

    【解决方案2】:

    使 user_profile 表中的 user_id 唯一且固定。

    【讨论】:

      【解决方案3】:

      如果是 1:1 关系,并且您经常将“user”表和“userprofile”中的记录一起带回,那么您可以考虑将它们合并到一个表中。

      【讨论】:

        【解决方案4】:

        是的,使用 FK 字段上的唯一索引来解决此问题。您现在需要修复它的原因是,当使用不允许您不想要的行为的控件正确设置数据库时,您无法控制人们随着时间的推移插入数据的严重程度。

        第一次将重复记录插入子表时,可能会破坏很多代码。如果没有唯一索引,插入第二条记录的机会可能会非常高。您可以说,您将在应用程序级别对此进行控制,但这通常是一个糟糕的选择,因为无法保证不会发生绕过该应用程序的其他应用程序、批量插入等。在数据库设计中尽快把事情做好是至关重要的。当数据库中有很多记录时,修复糟糕的设计变得非常困难。

        【讨论】:

          【解决方案5】:

          @pranay

          User Table 
             Userid(p)
             UserName
             othercol..
          
          UserProfile 
             id(p)
             UserId(f) - and unique
             othercol..
          

          这通常是你的做法吗(上图)?还是你这样做(下)?

          User Table 
             Userid(p)
             UserName
             othercol..
          
          UserProfile 
             id(p) <--- userid
             othercol..
          

          【讨论】:

          • 是的,你也可以这样做,因为你必须在这两个表之间建立一对一的关系
          • 鉴于 OP 已有设计,它们的列更有可能适合您的第一个示例。在这种情况下,实施您的第二个建议将涉及重写应用程序的一部分,而仅在外键列上强制执行唯一约束则不会。
          猜你喜欢
          • 1970-01-01
          • 2011-08-23
          • 1970-01-01
          • 1970-01-01
          • 2011-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多