SQL表设计帮助

发布于 2024-09-26 08:57:41 字数 711 浏览 3 评论 0原文

我接管了一个具有 SQL 后端的应用程序。有多个表,但我关心的两个是:

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


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

我的问题是 SecurityGroups 字段是一个以逗号分隔的 GroupID 值列表。

因此,配置文件表如下所示:

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

一个配置文件可以有多个安全组,一个安全组可以位于多个配置文件上

对于如何重新设计这个有什么建议吗?

I've taken over an application that has a SQL backend. There are multiple tables, but the two that I'm concerned about are these:

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


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

My issue is that the the SecurityGroups field is a comma delimited list of GroupID values.

So the Profile table looks like this:

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

A profile can have muliple security groups and a security group can be on muliple profiles

Any suggestions on how to re-engineer this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

月竹挽风 2024-10-03 08:57:41

您希望重新设计它是件好事,因为一般来说逗号分隔的列表不属于 SQL 数据库。

看起来一个简单的联结表可以替换SecurityGroupsQAProfile 表:

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)
);

It's good that you're looking to re-engineer this, since in general comma-delimited lists don't belong to SQL databases.

It looks like a simple junction table can replace the SecurityGroups column of the QAProfile table:

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)
);
水溶 2024-10-03 08:57:41

如果是我,我会这样做:

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

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

QASecurityGroups
----------------
ProfileID<pk>
GroupID <pk>

If it was me, I would do it like this:

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

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

QASecurityGroups
----------------
ProfileID<pk>
GroupID <pk>
苍风燃霜 2024-10-03 08:57:41
Create Table QAProfileSecurityGroup (
 ProfileID int,
 GroupID int,
 PRIMARY KEY ( ProfileID, GroupID)
)
Create Table QAProfileSecurityGroup (
 ProfileID int,
 GroupID int,
 PRIMARY KEY ( ProfileID, GroupID)
)
但可醉心 2024-10-03 08:57:41
  • 添加表 ProfileSecurityGroups
  • 解析每个配置文件的字符串,并将对添加到表中
  • 更改应用程序层以使用新结构
  • 从配置文件表中删除 SecurityGroups 列

替代文本

  • add table ProfileSecurityGroups
  • parse that string for each profile and add pairs to the table
  • change the app layer to use new structure
  • drop the SecurityGroups column from the Profile table

alt text

つ低調成傷 2024-10-03 08:57:41

是的,小菜一碟,您可以创建一个像这样的联结表:

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

Yes piece of cake you could just create a junction table like this:

ProfileSecurityGroups
---------------------
Id, <pk> -int
ProfileId <fk>,
SecurityGroupId <fk>
眼睛会笑 2024-10-03 08:57:41
  • 应添加一个新的表 ProfileToGroup:

    个人资料ID
    GroupID

  • 您将需要编写一个 SQL 脚本来解析组列表,并将记录插入到每个配置文件/组组合的新表中。
  • 最后,应删除 QAProfile 表中的 SecurityGroups 列
  • A new Table ProfileToGroup should be added:

    ProfileID
    GroupID

  • You will need to write a SQL script to parse out the list of groups and insert records into the new table for each Profile/Group combination.
  • Finally, the SecurityGroups column in the QAProfile table should be removed
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文