我正在创建一个包含以下表的数据库模式(对于错误的伪代码抱歉):
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范式。有什么建议吗?
答案 0 :(得分:1)
如果你想强制执行每个用户必须并且将永远拥有他的"默认"集合,然后由于包含依赖项中的明显循环,您被强制进入延迟约束检查(如果您的DBMS允许首先声明FK循环)或应用程序强制完整性。
如果你可以容忍没有任何默认收藏的用户,那么创建一个单独的表DFT_COLL(userid,dft_coll_id),其中包含关键用户ID和FK,以及USER和COLLECTION。
如果在用户没有默认收集的情况下给您带来麻烦,可能仍然可以通过让系统选择一个(例如ID最低[或最高]的那个)来解决这个问题并使用UNION实现查看(如果您需要默认值,那么您将阅读UNION视图并确保(*)获得某些结果)。
(*)如果用户有一个集合,那就是。请注意,要求默认集合并要求存在,意味着每个用户至少需要一个集合。 (其必然结果是,如果必须允许用户完全没有收藏,那么它是荒谬的,并且要求他拥有默认收藏是矛盾的。)
答案 1 :(得分:0)
我认为最合理的解决方案是:
在“默认”列中保留“true”-s和NULL(无false)。
这不允许与同一user_id关联的多个集合具有除null之外的相同“默认”值。您不需要开发任何应用程序逻辑。但是,此设计不会强制您始终为用户提供默认集合。