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

时间:2017-01-12 21:21:33

标签: database relational-database database-schema

我正在创建一个包含以下表的数据库模式(对于错误的伪代码抱歉):

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框架中这样做,但我对优雅的平台无关解决方案更感兴趣。当我尝试在User中创建一个列为Collection的外键时,它会抱怨Collection还不存在(我想因为User是先创建的)。我可以添加"默认" boolean column to Collection并通过我的应用程序强制执行每个用户只有一条记录" true",但这看起来不够优雅。我还可以有一个单独的表,比如User_Default_Collection,它有user_id作为Foreign,Unique Key和collection_id列,它是Collection的外键。但我确定这也不到第3范式。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果你想强制执行每个用户必须并且将永远拥有他的"默认"集合,然后由于包含依赖项中的明显循环,您被强制进入延迟约束检查(如果您的DBMS允许首先声明FK循环)或应用程序强制完整性。

如果你可以容忍没有任何默认收藏的用户,那么创建一个单独的表DFT_COLL(userid,dft_coll_id),其中包含关键用户ID和FK,以及USER和COLLECTION。

如果在用户没有默认收集的情况下给您带来麻烦,可能仍然可以通过让系统选择一个(例如ID最低[或最高]的那个)来解决这个问题并使用UNION实现查看(如果您需要默认值,那么您将阅读UNION视图并确保(*)获得某些结果)。

(*)如果用户有一个集合,那就是。请注意,要求默认集合并要求存在,意味着每个用户至少需要一个集合。 (其必然结果是,如果必须允许用户完全没有收藏,那么它是荒谬的,并且要求他拥有默认收藏是矛盾的。)

答案 1 :(得分:0)

我认为最合理的解决方案是:

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

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

    这不允许与同一user_id关联的多个集合具有除null之外的相同“默认”值。您不需要开发任何应用程序逻辑。但是,此设计不会强制您始终为用户提供默认集合。