我试图在我的数据库中管理表关系,但我模拟的每个选项最终都会创建周期性关系,这似乎是一个很大的禁忌。这是我的设置:
我有群组表:
+----+--------+
| id | name |
+----+--------+
| 1 | group1 |
| 2 | group2 |
+----+--------+
我还有一个 UserToGroup 表,为用户提供对群组的访问权限(具有不同的权限级别),其中FK指向我的群组(多对一)和我的用户表(多对一):
+----+----------+---------+---------------+
| id | group_id | user_id | permission_id |
+----+----------+---------+---------------+
| 1 | 1 | 1 | 2 |
| 2 | 1 | 2 | 3 |
| 3 | 2 | 1 | 2 |
+----+----------+---------+---------------+
我遇到的问题是我想在组表的每个实例上添加一个所有者标志,其中创建FK约束会阻止SQL删除 UserToGroup 群组所有者的实例(最终群组的所有者不能失去对其群组的访问权限。
从功能上讲,所有者权限完全独立于授予用户的权限(因为所有者可以访问某些管理页面,而权限访问授予不同级别的读/写),并且我希望始终保持必需的实例,停止数据库(通过FK约束)从 UserToGroup 表中删除所有者的可能性,他在那里管理所有给定组的用户。
最初我有Group.owner_id
指向给定的用户,但这只会在用户被删除时创建一个FK约束。
我还尝试为我的数据库创建以下变体,但它们会创建周期性关系:
我在组表格中创建了一个指向 UserToGroup 实例的FK,并将其标记为所有者的实例:
+----+--------+---------------------+
| id | name | owner_user_to_group |
+----+--------+---------------------+
| 1 | group1 | 2 |
| 2 | group2 | 3 |
+----+--------+---------------------+
Inversly,我创建了一个所有者表,用于管理组和 UserToGroup 表之间的所有者检查:
+----+----------+------------------+
| id | group_id | user_to_group_id |
+----+----------+------------------+
| 1 | 1 | 2 |
| 2 | 2 | 3 |
+----+----------+------------------+
但在这两种情况下,它都与组表创建了一个周期性关系,在这两个表中,两者都无法相互创建。
我是否可以单独管理组实例的所有者和权限,还可以在我的数据库中创建两者之间的逻辑关系,以便我可以使用FK约束来避免SQL删除群组所有者的 UserToGroup 实例?