首先,我不确定如何准确搜索这个,所以如果它是重复的,请原谅。而且我什至不确定它是否更适合其他 StackExchange 站点之一;如果是这样,请告诉我,我会在那里问。无论如何...
项目概览
我正在做一个爱好项目——一个作家的笔记本——来练习编程和数据库设计。基本结构相当简单:用户可以创建笔记本,并在每个笔记本下创建与该笔记本关联的项目。也许笔记本是写一系列短篇小说的,而每个项目都是写一个单独的故事。
然后,他们可以将项目(场景、角色等)添加到笔记本中的特定项目或笔记本本身,使其与特定项目无关。这样,他们可以拥有跨越多个项目的场景或位置,以及具有特定于特定项目的一些场景或位置。
问题
我试图在数据库中保留大量的逻辑——如果可能的话,尤其是在表结构和约束中。我对很多项目的基本结构基本上是这样的(我使用的是 MySql,但这是一个非常普遍的问题——只是在语法上提到它):
CREATE TABLE SCENES(
ID BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
NOTEBOOK BIGINT UNSIGNED NULL,
PROJECT BIGINT UNSIGNED NULL,
....
);
问题是我需要确保至少设置了两个引用之一,笔记本和/或项目。不必同时设置它们——PROJECT 引用了它所在的 NOTEBOOK。我知道我可以有一个通用的“Parent Id”字段,但我不相信有可能有一个外国两张桌子的钥匙,对吧?还有可能添加额外的交叉引用表——即 SCENES_X_NOTEBOOKS 和 SCENES_X_PROJECTS——但这很快就会失控,因为我必须为我正在工作的每种不同的项目类型添加类似的表和。这也将引入确保每个项目在交叉引用表中都有一个条目的问题。
将这种逻辑放在存储过程或应用程序逻辑中很容易,但如果可能的话,我真的很想将它保持在某种约束中,以消除逻辑被绕过的任何可能性不知何故。
有什么想法吗?我几乎对任何事情都感兴趣——即使它涉及重新设计表格或其他东西。