Проектирование базы данных SQL Server: советы по многим отношениям - PullRequest
1 голос
/ 02 сентября 2011

Я настраиваю базу данных и нахожусь в месте, где я путаюсь с некоторыми таблицами «многие ко многим».Я ищу несколько советов о том, как лучше спроектировать это для производительности и масштабируемости.

Ниже я приведу пример своей установки и того, что я пытаюсь сделать.

У меня естьтаблица главных объектов ...

Учетная запись

AccountID| AccountName
-----------------------
   1     | First Account

... и затем дочерние объекты, которым будут предоставлены разрешения.

Страница

PageID | PageName
------------------
   1   | First Page

Управление

ControlID | ControlName
-----------------------
   1      | First Control

MenuItem

MenuItemID | MenuItemName
-------------------------
    1      | Menu Item 1

У меня естьТаблица разрешений для чтения / записи и т.д ...

Разрешение

PermissionID | PermissionName
------------------------------
    1        | CanRead
    2        | CanWrite
    3        | CanDelete

Итак, я пытаюсь связать таблицу разрешений между многими ко многим междуосновные объекты и дочерние объекты.Ниже я приведу список того, что я придумал, и почему я не думаю, что это правильно.

Одна таблица, чтобы управлять ими всеми

PermissionAccount

AccountID | PermissionID | ControlID | MenuItemID | PageID
----------------------------------------------------------
      1   |     2        | NULL      | NULL       | NULL
      2   |   NULL       | 2         | NULL       | NULL

* это решение просто безобразно.Для одной учетной записи может быть назначено множество MenuItemID

Одна таблица для каждого объекта

PermissionAccountControl

AccountID | ControlID | PermissionID
------------------------------------
    1     |    1      |     1
    1     |    2      |     1

PermissionAccountMenuItem

AccountID | MenuItemID | PermissionID
-------------------------------------
    1     |     1      |     2
    1     |     2      |     1

PermissionPage

AccountID | PageID | PermissionID
---------------------------------
    1     |   1    |    3
    1     |   2    |    1

Я склоняюсь больше ко второму варианту.Любые мысли или предложения приветствуются.

Ответы [ 2 ]

4 голосов
/ 02 сентября 2011

Последнее правильно

Это 4-я / 5-я нормальная форма при проектировании базы данных

1 голос
/ 02 сентября 2011

Вы также можете использовать полиморфную ассоциацию

+------------+------------+----------+--------------+
| AccountID  | ObjectType | ObjectID | PermissionID |
+------------+------------+----------+--------------+
|     1      | Page       |    1     |      1       |
|     1      | MenuItem   |    1     |      2       |
+------------+------------+----------+--------------+

Этот метод может быть полезен, если вам нужно обрабатывать разрешения для дополнительных объектов в вашем программном обеспечении в более поздний момент времени. Тогда вам не придется создавать новые таблицы или добавлять новые столбцы в существующие таблицы, если вы используете эту структуру таблиц.

...