Как эмулировать «расширение класса» таблицами базы данных? - PullRequest
8 голосов
/ 29 апреля 2011

У меня будет несколько разных типов пользователей, которые будут использовать мою систему.Для всех пользователей мне нужно хранить такие вещи, как имя пользователя, пароль, адрес электронной почты и т. Д., Но если они являются пользователем категории A, мне также нужно хранить значения для полей a, b и c, но если они являются пользователемкатегории B, мне нужно хранить значения для полей d, e, f и g.

USER
-------
id
username
password

CAT_A
--------
id
a
b
c

CAT_B
--------
id
d
e
f
g

Скорее всего, мне нужно использовать какую-то таблицу мостов, чтобы связать пользователя с одним из CATтаблицы, но как мне это сделать?Я не могу использовать что-то вроде этого:

EXTEND
--------
user_id
cat_id

Потому что я не знаю, к какой CAT-таблице относится cat_id.Нужно ли мне поле для каждой категории?Если это так, то это не выглядит нормализованным, поскольку будет много пустых полей, особенно если у меня есть 3 категории.

EXTEND
--------
user_id
cat_a_id
cat_b_id
...

Любые входные данные очень ценятся!

Ответы [ 2 ]

3 голосов
/ 29 апреля 2011

Существует несколько распространенных способов сопоставления иерархии в SQL.Поскольку в SQL нет естественного способа обработки наследования, каждый из этих традиционных методов имеет свои плюсы и минусы.Вот некоторые из наиболее распространенных: таблица на иерархию, таблица на тип и таблица на конкретный тип, но, вероятно, есть несколько других.Вот пример модели таблицы для каждого типа (каждый тип в вашем коде отображается непосредственно в таблицу):

User
---------------
user_id (PK, auto-generated?)
username
password

CategoryAUser
---------------
user_id (PK, FK to User.user_id)
a
b
c

CategoryBUser
---------------
user_id (PK, FK to User.user_id)
e
f
g
h

Чтобы получить всех пользователей категории A, выберите из внутреннего объединения User CategoryAUser.То же самое для пользователей категории B.Эта модель может или не может соответствовать вашим потребностям.Если это не так, я бы предложил поискать другие типы моделей, упомянутых выше.

1 голос
/ 21 декабря 2013

Я знаю, что эта ветка старая, но я сам ищу элегантное решение. Основываясь на том, что я сделал в прошлом:

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

Кроме того, вы можете «оставить внешнее объединение» всех таблиц категорий и основывать свой результат на том, какие столбцы вы получите. В этом случае вы получите обратно свои столбцы USER и все a, b, c, d, e, f и g. Конечно, некоторые из этих столбцов были бы нулевыми, если бы в этой таблице не было записей для этого пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...