Справка по разработке таблиц SQL - PullRequest
3 голосов
/ 05 октября 2010

Я взял на себя приложение, которое имеет 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,  | 
-------------------------------------------- 

Профиль может иметь несколько групп безопасности, а группа безопасности может быть в нескольких профилях

Любые предложения о том, как реорганизовать это?

Ответы [ 6 ]

10 голосов
/ 05 октября 2010

Хорошо, что вы хотите перестроить это, так как в общем случае списки, разделенные запятыми, не относятся к базам данных SQL.

Похоже, что простая таблица соединений может заменить столбец SecurityGroups таблицы QAProfile:

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)
);
4 голосов
/ 05 октября 2010

Если бы это был я, я бы сделал это так:

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

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

QASecurityGroups
----------------
ProfileID<pk>
GroupID <pk>
2 голосов
/ 05 октября 2010
  • добавить таблицу ProfileSecurityGroups
  • проанализировать эту строку для каждого профиля и добавить пары в таблицу
  • изменить слой приложения для использования новой структуры
  • dropстолбец SecurityGroups из таблицы профиля

alt text

2 голосов
/ 05 октября 2010
Create Table QAProfileSecurityGroup (
 ProfileID int,
 GroupID int,
 PRIMARY KEY ( ProfileID, GroupID)
)
1 голос
/ 05 октября 2010
  • Необходимо добавить новую таблицу ProfileToGroup:

    ProfileID GroupID

  • Вам потребуется написать сценарий SQL, чтобы разобрать список групп и вставить записи в новую таблицу для каждой комбинации профиля / группы.
  • Наконец, столбец SecurityGroups в таблице QAProfile должен быть удален
1 голос
/ 05 октября 2010

Да, кусок пирога, вы можете просто создать распределительную таблицу, как это:

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