Mysql 要在帐户中具有唯一的组名,请具有子帐户
以下用例的DB设计: 帐户将有多个子帐户。帐户和子帐户中也将包含组。组名在帐户中应该是唯一的,如何对此进行DB设计Mysql 要在帐户中具有唯一的组名,请具有子帐户,mysql,Mysql,以下用例的DB设计: 帐户将有多个子帐户。帐户和子帐户中也将包含组。组名在帐户中应该是唯一的,如何对此进行DB设计 Account (table) |------> Group (table) |----> GroupA (Value for Group table) |------> Subaccount1 (table) |----> Group (table) | |----> Group
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如果我们尝试使用相同的名称对于表组中的两个不同行,code>和acc\u id
,DB将不允许这样做。如果我们使用不同的acc\u id
尝试相同的名称
,DB将允许这样做。您不需要