2010-10-05 108 views
3

我接管了一个具有SQL后端的应用程序。有多个表,但我很担心这两个是这些:SQL表设计帮助

QAProfile 
--------- 
ProfileID <pk> -int 
ProfileName 
SecurityGroups -varchar(max) 


SecurityGroups 
-------------- 
GroupID <pk> -int 
GroupName 

我的问题是,该SecurityGroups场群ID值的逗号分隔的列表。

所以配置表如下:

-------------------------------------------- 
| ProfileID | ProfileName | SecurityGroups | 
-------------------------------------------- 
| 1  |  foo  | ,1,13,34,56, | 
-------------------------------------------- 
| 2  |  bar  | ,4,13,29,56, | 
-------------------------------------------- 

配置文件可以有muliple安全组和安全组可以在muliple型材

就如何重新设计这个有什么建议?

回答

10

这是很好的,你是希望对其进行重新设计,因为通常以逗号分隔的列表不属于SQL数据库。

它看起来像一个简单的junction table可以代替QAProfile表的SecurityGroups列:

CREATE TABLE SecurityGroups_Profiles (
    GroupID  int NOT NULL, 
    ProfileID int NOT NULL, 
    PRIMARY KEY (GroupID, ProfileID), 
    FOREIGN KEY (GroupID) REFERENCES SecurityGroups (GroupID), 
    FOREIGN KEY (ProfileID) REFERENCES QAProfile (ProfileID) 
); 
+0

你的更好,你甚至添加了FK的!我想他们可以自己做。 – Sage 2010-10-05 18:39:48

+0

我不同意这种说法:“逗号分隔的列表不属于SQL数据库”似乎有点教条 - 当然有这种策略对于性能的原因是非常有利的。 – James 2010-10-05 18:41:20

+0

@詹姆斯:你有一点。对这句话增加“一般”更准确。 – 2010-10-05 18:42:06

1

是小菜一碟,你可以只创建一个结表是这样的:

ProfileSecurityGroups 
--------------------- 
Id, <pk> -int 
ProfileId <fk>, 
SecurityGroupId <fk> 
4

如果是我,我会做这样的:

QAProfile 
--------- 
ProfileID <pk> -int 
ProfileName 

SecurityGroups 
-------------- 
GroupID <pk> -int 
GroupName 

QASecurityGroups 
---------------- 
ProfileID<pk> 
GroupID <pk> 
2
Create Table QAProfileSecurityGroup (
ProfileID int, 
GroupID int, 
PRIMARY KEY (ProfileID, GroupID) 
) 
1
  • 新表ProfileToGroup应增加:

    简档 组ID

  • 你将需要编写一个SQL脚本来解析出组的列表并将记录插入到每个Profile/Group组合的新表中。
  • 最后,在QAProfile表SecurityGroups列应被删除
2
  • 添加表ProfileSecurityGroups
  • 解析该字符串的每个配置文件,并添加对表
  • 变化到使用该应用层新结构
  • 从Profile表中删除SecurityGroups列

alt text

+0

顶部的方式必须给你+1掀起一个图! – James 2010-10-05 19:03:45