在我的案例中,我真的需要一个关系表吗?

时间:2015-02-06 14:00:58

标签: sql

假设我有一个模块。我构建了一个界面,用户可以将模块分配给组。 让我们说目前我有3组。在UI中,用户将选择所有3个组以将模块分配给它们。对于多选框中的考试。

用户的意图是将模块分配给所有组。

我想我需要一对多关系表。我的源代码将执行sql查询以插入3个条目。

但是等等。如果两周后管理员添加一个新组怎么办...在关系表中只有3个条目。用户想知道为什么模块没有分配给新添加的组。

什么是优雅的解决方案?我需要明确更新关系表,或者我创建一个新列 - 称为“组” - 在我的模块表中,我以这种格式添加指定的groupsIds:“1; 2; 7; 15”或关键字“所有”。 优点是,使用关键字“All”,我可以在代码中知道模块已分配给所有组。 使用关系表我没有这个选项。另外,我不需要为模块分配组。我只需要为组分配一个模块。 在我看来,在这种情况下我不需要关系表。

你会说什么?或者你有另一种方法吗?

2 个答案:

答案 0 :(得分:0)

要建立多对多关系,您需要一个关系表。

使用一个解决方案,比如在字段中放置逗号分隔值以使多个关系仅在单独的查询中从单独的表中获取数据时才有效,当您需要使用它来连接数据库中的数据时,它变得非常复杂很快。

在关系表中,您可以使用null值表示“全部”。在此示例中,模块1和2仅是组1的成员,模块3是所有组的成员:

ModuleId GroupId
-------- -------
       1       1
       2       1
       3    null

使用类似关系获取组的数据,例如:

select
    g.GroupName,
    m.ModuleName
from
    Groups g
    inner join GroupModules gm on gm.GroupId is null or gm.GroupId = g.GroupdId
    inner join Modules m on m.ModuleId = gm.ModuleId

另一种方法是像往常一样使用关系表,并在模块上添加属性,使其成为所有组的成员。添加新组时,还可以在关系表中为所有组成员的模块添加记录。示例(在T-SQL中):

create procedure Group_Add
  @GroupName varchar(50)
as

set nocount on

declare @id int

insert into Groups (
  GroupName
) values (
  @GroupName
)

set @id = scope_identity()

insert in GroupModules (
  GroupId,
  ModuleId
)
select
  @id, ModuleId
from
  Modules
where
  IsInAllGroups = 1

答案 1 :(得分:0)

典型的数据库模式是3个表,Module,Group,GroupModule。这就是在数据库设计中如何正确处理多对多关系。

如何填充数据是UI的问题。您确实可以有一个下拉列表,其中包含单词all,供他们选择模块将与之关联的组。它甚至可以是默认值。你要做的是写代码来解释ALL为每个组插入一条记录。

如果您要添加组和模块,则还需要一个进程来确保在添加组时,所有shoudl都将所有组添加到新组中。就个人而言,我会在Module表上放置一个IS_ALL标志,以使这更容易。然后你知道为所有组选择了哪些模块。您需要确保如果某人返回并将模块更改为特定组,而不是更新此字段的所有内容。