Наследование в таблицах - проблема структуры - PullRequest
0 голосов
/ 13 января 2011

В моей системе 3 типа пользователей. каждый тип имеет разную информацию Я создал следующие таблицы:

BaseUser(base_user_id, username, password, additional common data)

base_user_id - это PK и Identity

UserType1(user_id, data related to type1 only)

user_id - это PK и FK для base_user_id

UserType2(user_id, data related to type2 only)

user_id - это PK и FK для base_user_id

UserType3(user_id, data related to type3 only)

user_id - это PK и FK для base_user_id

Теперь я имею отношение к каждому типу пользователей к таблице складов. Пользователи типа 1 и типа 2 должны иметь только warehouse_id, а пользователи типа 3 должны иметь warehouse_id и customer_id.

Я думал об этой структуре:

WarehouseOfUser(base_user_id,warehouse_id)

base_user_id - от FK до base_user_id в BaseUser

WarehouseOfTyp3User(base_user_id,warehouse_id, customer_id)

base_user_id - от FK до base_user_id в BaseUser

Проблема в том, что такая структура допускает 2 вещи, которые я хочу предотвратить: 1. добавить в WarehouseOfTyp3User данные пользователя от типа 2 или типа 1. 2. добавить в WarehouseOfUser данные пользователя из типа 3.

какая структура лучше всего подходит для такого случая?

Обновление: я должен использовать один и тот же диапазон идентификаторов для всех типов пользователей. Я не могу создать отдельную таблицу для каждого пользователя, поскольку мне нужен один и тот же идентификатор_пользователя для каждой таблицы.

Ответы [ 2 ]

1 голос
/ 13 января 2011

Это второй ответ, но он совсем другой. Я предлагаю реструктурировать ваши данные следующим образом:

table BaseUser(baseUserId, password,...)
table User1(user1Id -> PK, baseUserId -> FK to BaseUser, warehouse1id -> FK to warehouse1 table) 
table User2(user2Id -> PK, baseUserId -> FK to BaseUser, warehouse1id -> FK to warehouse1 table)
table User3(user3Id -> PK, baseUserId -> FK to BaseUser, warehouse3id -> FK to warehouse3 table, customerId)
table Warehouse1(warehouse1id...)
table Warehouse3(warehouse3id...)
0 голосов
/ 13 января 2011

Кажется, что это легко решить для user3 - просто добавьте новое поле идентификации в таблицу user3, удалите base_user_id из таблицы warehouse3, вместо этого добавьте user3Id и добавьте внешний ключ с таблицей user3, используя user3id. Так что нет ссылки на таблицу baseUser. Это решает проблему 1.

Аналогичным образом добавьте user1id и user2id в другие пользовательские таблицы, удалите base_user_id из таблицы хранилища, добавьте просто userid и добавьте 2 внешних ключа для связи с таблицами user1 и user2. Это должно решить проблему 2.

В качестве альтернативы вы можете попробовать использовать триггеры, но я не особенно люблю триггеры.

...