Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design “建模”;“可选”;外键_Database Design - Fatal编程技术网

Database design “建模”;“可选”;外键

Database design “建模”;“可选”;外键,database-design,Database Design,我有两个实体 使用者 用户信用卡 用户可以有信用卡,也可以没有。您将如何对这种关系进行建模?为什么 选项1:用户的UserCreditCard外键可能为空 选项2:UserCreditCard对用户有一个外键,该外键不能为空 编辑 我的错误是没有指出用户将拥有0或1张信用卡,没有更多的信用卡。我想您已经说明了如何以及为什么要对其进行建模: 用户可以有信用卡,也可以没有 选择1。您可以通过检查外键来区分谁有卡,谁没有卡,并且您的映射仍然有效,因为如果信用卡外键为null,则信用卡将与任何内容都

我有两个实体

  • 使用者
  • 用户信用卡
用户可以有信用卡,也可以没有。您将如何对这种关系进行建模?为什么

选项1:用户的UserCreditCard外键可能为空

选项2:UserCreditCard对用户有一个外键,该外键不能为空

编辑


我的错误是没有指出用户将拥有0或1张信用卡,没有更多的信用卡。我想您已经说明了如何以及为什么要对其进行建模:

用户可以有信用卡,也可以没有


选择1。您可以通过检查外键来区分谁有卡,谁没有卡,并且您的映射仍然有效,因为如果信用卡外键为null,则信用卡将与任何内容都不匹配,因此它将为null。但是,当您删除信用卡时,您必须小心,因为您删除了用户实体中的映射。

在此,我将避免建立双向关系。使用引用
User
表的
UserID
列对
CreditCard
表进行建模似乎更有意义。向
用户添加
creditcardd
引用只会增加不必要的复杂性和出错的机会


我建议将引用从
用户
删除到
信用卡
,并将引用从
信用卡
删除到
用户
不可为空和索引。这将为您提供所需的一切。

选择选项二。它的复杂性更低,而且它还模拟了用户拥有多张信用卡或更换信用卡的情况。

谢谢!我的想法不是双向关系,而是只在一个表中添加外键。试着决定哪一方更好。@Timmy:然后选择后者;没有信用卡的用户有意义,没有用户的信用卡就没有意义。此外,第二种模式允许每个用户使用多张卡(也可以限制为一张具有简单唯一索引的卡),而第一种模式则不允许。简而言之,除非你希望两个用户能够共享同一张卡(这通常是不允许的),否则我看不到任何可能指引我到第一个选项的东西,即使这样,我也可能选择M:M关系,而不是第一个选项。TL;DR版本:不要使用第一个选项。非常完整的解释和充分的理由。谢谢!当然,亚当斯,我只是想看看有没有人还有别的话要说。我希望能有更多的意见:-(如果没有其他人简短地添加任何内容,请承诺标记为已解决。如果用户有多张卡怎么办?