Пользовательские записи базы данных - PullRequest
2 голосов
/ 29 сентября 2011

Это больше теоретические вопросы. В любом случае, Предположим, что у меня есть база данных (50 таблиц) И данные во ВСЕХ этих таблицах должны храниться специально для одного пользователя. Я имею в виду, что обычно мы делаем внешние ключи для каждой таблицы, которая зависит от пользователя. и получение данных, используя что-то вроде:

select Column1,Col2,Col3 from Table where UserId=@UserId

Это значительно усложняет запросы. Есть ли другой способ хранения таких данных?

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

То, на что вы ссылаетесь, имеет название.Это называется мультитенант .Ссылка дает некоторую общую информацию о мультитенантных структурах.

Хотя все это зависит от вашей RDBMS.Oracle предоставляет инструмент, который делает это очень легко.

WHERE User_ID = @User_ID 

становится политикой , которую вы можете применять к таблицам.Вы также создаете защищенную хранимую процедуру для обновления @User_id, чтобы гарантировать, что ее нельзя изменить без прав доступа.Затем каждый запрос к таблице с такой политикой добавляет предложение where в фоновом режиме.Это автоматический режим, и избежать его невозможно.

2 голосов
/ 29 сентября 2011

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

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

Пример:

CarMake:
MakeId
MakeName
UserId

CarModel:
ModelId
MakeId
ModelName

Обратите внимание, что CarModel не имеет столбца UserId, но можно предположить, что он наследует тот же UserId родительской записи CarMake.Если вы не можете предположить, что дети всегда должны наследовать родительский UserId, тогда лучше всего использовать оригинальный метод.

...