Mysql 要在帐户中具有唯一的组名,请具有子帐户

Mysql 要在帐户中具有唯一的组名,请具有子帐户,mysql,Mysql,以下用例的DB设计: 帐户将有多个子帐户。帐户和子帐户中也将包含组。组名在帐户中应该是唯一的,如何对此进行DB设计 Account (table) |------> Group (table) |----> GroupA (Value for Group table) |------> Subaccount1 (table) |----> Group (table) | |----> Group

以下用例的DB设计:

帐户将有多个子帐户。帐户和子帐户中也将包含组。组名在帐户中应该是唯一的,如何对此进行DB设计


Account (table)
|------> Group (table)
          |----> GroupA (Value for Group table)
|------> Subaccount1 (table)
          |----> Group (table)
          |      |----> GroupA (Value for Group table. This should not be allowed).
                 |----> GroupB (Value for Group table.)
          |----> Subaccount2 (table)
                 |-----> Group (table)
                         |-----> GroupB (This should not be allowed, as the parent subaccount has it in its group)

您将有两个表:

(a) table ACCOUNTS with these columns:
id = primary key
name = account name (with unique key on it)
parent_id = foreign key into table ACCOUNTS to represent sub-accounts

(b) table GROUPS with these columns
id = primary key
name = group name
sub_acc_id = foreign key into table ACCOUNTS (NULL if this group is attached to account only)
acc_id = foreign key into table ACCOUNTS (either the account where this group is attached to, or the parent of `sub_acc_id`)
列(acc_id,name)上应该有一个唯一的键,以符合您对组名的要求

当然,如果您想要超过1级的层次结构,这将不起作用

更新-经过一些思考后,看起来此数据模型将在无限层次结构中工作-但在帐户之间移动子帐户时,必须在表组中维护正确的ACC_ID

说明:

组名可以附加到
帐户
(其父项ID为空的帐户)或
子帐户
(其父项ID不为空的帐户)。在第一种情况下,我们已经知道层次结构树的根(帐户本身),但在第二种情况下,我们需要
子帐户
(其中附加了组名)和给定层次结构树的根,如果我们想使用唯一键来施加来自需求的约束(即-避免为此使用触发器)

因此,当我们想将一个组名附加到一个
帐户时,我们使用列
acc\u id
,并在列
sub\u acc\u id
中输入一个空值。当我们想将一个组名附加到
sub\u acc\u id
帐户时,我们使用列
sub\u acc\u id
,并将这个子帐户的伟大的祖先放入
acc\u id


由于给定帐户下的所有子帐户将具有相同的
acc\u id
值,因此我们可以在表组中的
(名称,acc\u id)
列上放置一个唯一键,该键将阻止相同根帐户下的相同名称,但允许两个帐户具有相同的组名。

您将有两个表:

(a) table ACCOUNTS with these columns:
id = primary key
name = account name (with unique key on it)
parent_id = foreign key into table ACCOUNTS to represent sub-accounts

(b) table GROUPS with these columns
id = primary key
name = group name
sub_acc_id = foreign key into table ACCOUNTS (NULL if this group is attached to account only)
acc_id = foreign key into table ACCOUNTS (either the account where this group is attached to, or the parent of `sub_acc_id`)
列(acc_id,name)上应该有一个唯一的键,以符合您对组名的要求

当然,如果您想要超过1级的层次结构,这将不起作用

更新-经过一些思考后,看起来此数据模型将在无限层次结构中工作-但在帐户之间移动子帐户时,必须在表组中维护正确的ACC_ID

说明:

组名可以附加到
帐户
(其父项ID为空的帐户)或
子帐户
(其父项ID不为空的帐户)。在第一种情况下,我们已经知道层次结构树的根(帐户本身),但在第二种情况下,我们需要
子帐户
(其中附加了组名)给定层次结构树的根-如果我们希望使用唯一键来施加来自需求的约束(即-避免使用触发器)

因此,当我们想将一个组名附加到一个
帐户时,我们使用列
acc\u id
,并在列
sub\u acc\u id
中输入一个空值。当我们想将一个组名附加到
sub\u acc\u id
帐户时,我们使用列
sub\u acc\u id
,并将这个子帐户的伟大的祖先放入
acc\u id


由于给定帐户下的所有子帐户将具有相同的
acc\u id
值,因此我们可以在
列上放置一个唯一键(名称,acc\u id)
在表组中,此键将阻止相同根帐户下的相同名称,但将允许两个帐户具有相同的组名。

为什么
子帐户的子树中允许
,而
组a
不允许?或者
是假的,链接方案必须是
组a
e> 子帐户
->
GroupA
最后一个(最右边)的位置
GroupA
是不允许的?如果假设您有一个
groups
表,是否可能有两个不同的组,其中一个组相同?为什么允许使用名为
GroupA
的组?@Akina:在子帐户中,可以有一些组本身。帐户中的组名不应在子帐户组名中重复:facepalm:
G组
GroupA
方案中的单词表示两个名称不同的单独组?或者只有一个组的名称为
GroupA
,而单词
GroupA
不是组名,表示
Account
Subaccount
是“容器”哪些可能包括一些组?为什么
子账户
的子树中允许
,而
组a
不允许?或者
是假的,链接方案必须是
组a
子账户
组a
,其中最后一个(最右边)
GroupA
是不允许的?如果假设您有一个
groups
表,是否可能有两个不同的组,其中一个组相同?为什么允许使用名为
GroupA
的组?@Akina:在子帐户中,可以有一些组本身。帐户中的组名不应在子帐户组名中重复:facepalm:
G组
GroupA
方案中的单词表示两个名称不同的单独组?或者只有一个组的名称为
GroupA
,而单词
GroupA
不是组名,表示
Account
Subaccount
是“容器”其中可能包括一些组?子帐户可以有n级层次结构。Ivo,如果我们有两个组,其中一个具有相同的
名称
,但具有不同的
id
,那么这样一个唯一的键将是错误的,即方法将是不同的。这就是为什么我要求这样一种可能性。@mitkosoft如果我们尝试使用相同的
名称
acc\u id
,DB将不允许这样做。如果我们使用不同的
acc\u id
尝试相同的
名称
,DB将允许这样做。您不需要