繁体   English   中英

如何在关系数据库中的一对多关系上定义一对一关系?

[英]How do I define a one-to-one relationship over a one-to-many relationship in a relational database?

我正在使用以下表格创建数据库架构(抱歉,错误的伪代码):

User
====
user_id, PK

Collection
==========
collection_id, PK
user_id, FK(User->user_id)

Issue
=====
issue_id, PK
collection_id, FK(Collection->collection_id)

从用户到馆藏,还有从馆藏到发行,存在一对多的关系。 因此,单个用户可以维护多个馆藏,每个馆藏都有很多问题。

问题:我想指定一个“默认”集合,以在用户首次登录该应用程序时显示。 作为记录,我正在Django框架中进行此操作,但是我对与平台无关的优雅解决方案更感兴趣。 当我尝试在用户中创建一个作为集合外键的列时,它抱怨说集合尚不存在(我想是因为首先创建了用户)。 可以向Collection中添加一个“默认”布尔列,并通过我的应用程序强制每个用户只有一个记录为“ true”,但这看起来并不雅致。 我还可以有一个单独的表,例如User_Default_Collection,该表具有user_id作为外键,唯一键,还有一个collection_id列是Collection的外键。 但是我敢肯定,这也小于第三范式。 有什么建议么?

如果您要强制每个用户必须并且将始终拥有其“默认”集合,则由于包含依赖项中存在明显的循环,因此您不得不执行延迟约束检查(如果DBMS允许在FK循环中声明FK循环)第一名)或应用程序强制的完整性。

如果您可以容忍根本没有任何默认集合的用户,则创建一个单独的表DFT_COLL(userid,dft_coll_id),其中的USERID和FK分别为USER和COLLECTION。

如果在用户没有默认集合的情况下给您带来麻烦,也许仍然可以通过让系统仅选择一个(例如,具有最低[或最高] id的那个)并使用UNION视图实现此问题来解决(因此如果您需要默认值,则可以阅读UNION视图,并可以确保获得一些结果(*)。

(*)如果用户完全有收藏,那就是。 请注意,需要默认集合并要求该集合存在,意味着每个用户至少需要一个集合。 (这的必然结果是,如果必须允许用户根本没有任何收藏,那么要求他拥有默认收藏是不明智的和矛盾的。)

我认为最可行的解决方案是:

  1. 将可为空的“默认”字段添加到“集合”表
  2. 为used_id和default创建UNIQUE约束

在“默认”列中保留“ true” -s和NULL(无false)。

这将不允许与同一user_id关联的多个Collection具有相同的“默认”值,而不是null。 您无需开发任何应用程序逻辑。 但是,这种设计不会强迫您始终为用户保留默认集合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM