Лучший способ создать базу данных для размещения неопределенного количества полей на пользователя? - PullRequest
0 голосов
/ 25 марта 2012

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

Например, пользователь1 участвует в проектах A, B и C. Пользователь2 участвует в проектахA, C, E и G, в то время как User3 участвует в проектах A, B, C, D, E, F и G.

Таблица с пользователями, перечисленными в строках, а затем еще 7 столбцами для записи проектов, которые ониучастие в нем будет весьма неплохо ... пока мне не придётся учесть User4, который в итоге будет вовлечен в 100 проектов, которым в моей модели потребуется 100 столбцов для отслеживания.

В конечном итогенет никакого способа узнать заранее, сколько столбцов нужно определить.

Я мог бы перевернуть его и связать User1 & User3 с Проектом B, но затем в дальнейшем, после того, как будет 10000 Проектов, у меня будетпросмотреть каждую запись проекта, чтобы получить полный список проектов, в которые был вовлечен данный пользователь, что кажется ужасно неэффективным.

Итак ... какследить?Просто не могу обернуть голову вокруг этого.

Я новичок, так что простите, если это плохо заявлено или грубо элементарно.

Спасибо,

Бен

Ответы [ 2 ]

4 голосов
/ 25 марта 2012

Похоже, вы пытаетесь смешать эти две сущности (user и project) в одну таблицу, что на самом деле не лучший путь.

Другой подходчтобы информация о вашем пользователе была в таблице user, информация о проекте в таблице project и другая таблица "link", такая как user_projects, которая просто содержала бы поля идентификаторов из таблиц user и project,одна запись для каждого пользователя в каждом проекте.

пример схемы:

user (userID, firstName, lastName)

project (projectID, projectTitle)

user_projects (userID, projectID)

Чтобы выбрать названия проектов для пользователя 3, вы можете сделать что-то вроде:

SELECT p.projectTitle 
FROM project p INNER JOIN user_projects up ON p.projectID = up.projectID
WHERE up.userID = 3

Цель таблицы user_projects - связать информацию, содержащуюся в таблицах user и project, то есть все.

3 голосов
/ 25 марта 2012

Типичное отношение «многие ко многим».

Вам необходимо составить таблицу, в которой каждая запись будет иметь отношение: user_id, project_id.Если какой-то пользователь (id = uid) связан с проектом (id = pid), то и только тогда в этой таблице есть пара (запись с 2 столбцами): user_id, project_id.

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

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

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