Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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 在这种情况下,如何确定外键的放置位置?_Database_Database Design_Foreign Keys_Entity Relationship_Foreign Key Relationship - Fatal编程技术网

Database 在这种情况下,如何确定外键的放置位置?

Database 在这种情况下,如何确定外键的放置位置?,database,database-design,foreign-keys,entity-relationship,foreign-key-relationship,Database,Database Design,Foreign Keys,Entity Relationship,Foreign Key Relationship,如果我有两个表-登录名和用户,如下所示: Logins LoginIdNo UserIdNo HashedPassword Users UserIdNo LoginIdNo Username 每个登录名“有一个用户”,每个用户“有一个登录名”,但哪个“属于”哪个 这仅仅是一个判断调用,还是有一个明确的公式来确定外键应该驻留在哪里?由于登录永远不会与多个用户关联(反之亦然),因此这是一个关于如何定义关系(以及外键放置在何处)的任意决定。除非您还打算添加其他属性(Firled)或使

如果我有两个表-登录名和用户,如下所示:

Logins
 LoginIdNo
 UserIdNo
 HashedPassword 

Users
 UserIdNo
 LoginIdNo
 Username
每个登录名“有一个用户”,每个用户“有一个登录名”,但哪个“属于”哪个


这仅仅是一个判断调用,还是有一个明确的公式来确定外键应该驻留在哪里?

由于登录永远不会与多个用户关联(反之亦然),因此这是一个关于如何定义关系(以及外键放置在何处)的任意决定。除非您还打算添加其他属性(Firled)或使用角色,否则简单地这样定义可能会更简单:

Users 
    UserIdNo 
    Username
    HashedPassword

由于登录永远不会与多个用户关联(反之亦然),因此您可以任意决定如何定义关系(以及将外键放置在何处)。除非您还打算添加其他属性(Firled)或使用角色,否则简单地这样定义可能会更简单:

Users 
    UserIdNo 
    Username
    HashedPassword

这是一对一的关系。在这些情况下,外键的放置位置可能由可选性决定

你把它分成两个实体有什么特别的原因吗?我不太喜欢一对一的映射,特别是在像JPA这样的ORM上,它们很难实现(如果使用主键作为外键)

在您的系统中,登录和用户之间有什么区别

如果每次用户登录时都要进行登录(即,这是用户活动的审计跟踪),那么用户和登录之间存在一对多关系,登录应该使用UserID外键


但是在这种情况下,用户名在一个表中,密码在另一个表中,两者之间存在一对一的关系。你必须问为什么它们分开。

这是一对一的关系。在这些情况下,外键的放置位置可能由可选性决定

你把它分成两个实体有什么特别的原因吗?我不太喜欢一对一的映射,特别是在像JPA这样的ORM上,它们很难实现(如果使用主键作为外键)

在您的系统中,登录和用户之间有什么区别

如果每次用户登录时都要进行登录(即,这是用户活动的审计跟踪),那么用户和登录之间存在一对多关系,登录应该使用UserID外键


但是在这种情况下,用户名在一个表中,密码在另一个表中,这两者之间存在一对一的关系,你必须问为什么它们是分开的。

我所想的登录名和用户名之间有两个区别。一个是用户表将有许多其他的联系信息字段(地址、电话等)。虽然Logins表在数据方面更加稀疏,但作为一个整体,该表可能独立于我的应用程序进行某种形式的加密(不确定具体如何进行)。您的审计跟踪示例很好地说明了这一点。相反,如果用户数据的每次编辑都需要审计跟踪,那么外键可能是LoginId,除非登录信息也经过审核-如果用户和登录都有审核跟踪,我不确定这是如何工作的-在这种情况下,也许我们还需要一个UserAudit和LoginAudit表?@fraggle:我更愿意将这种区别视为个人和用户,这是一个合理的建模决策。但是如果你这样做的话,用户名和密码可能在同一个实体上。是的,我同意-个人和用户是有意义的。但我不确定我是否理解你的说法“如果你这样做,用户名和密码可能在同一个实体上”。你的意思是在这种情况下用户名和密码都存在于用户实体中吗?我想的是登录和用户之间有两个区别。一个是用户表将有许多其他的联系信息字段(地址、电话等)。虽然Logins表在数据方面更加稀疏,但作为一个整体,该表可能独立于我的应用程序进行某种形式的加密(不确定具体如何进行)。您的审计跟踪示例很好地说明了这一点。相反,如果用户数据的每次编辑都需要审计跟踪,那么外键可能是LoginId,除非登录信息也经过审核-如果用户和登录都有审核跟踪,我不确定这是如何工作的-在这种情况下,也许我们还需要一个UserAudit和LoginAudit表?@fraggle:我更愿意将这种区别视为个人和用户,这是一个合理的建模决策。但是如果你这样做的话,用户名和密码可能在同一个实体上。是的,我同意-个人和用户是有意义的。但我不确定我是否理解你的说法“如果你这样做,用户名和密码可能在同一个实体上”。您的意思是,在该场景中,用户名和密码将同时存在于用户实体中吗?