|
|
|
Покритикуйте организацию базы данных
|
|||
|---|---|---|---|
|
#18+
Доброго дня всем! Задача такая: нужно построить учетную систему (поступления, расходы + отчеты и необходимая аналитика). В системе будет работать много пользователей (ориентировочно около 1000). Каждый пользователь оперирует только своими данными, с данными других пользователей не пересекается, доступ к данным другого пользователя нужно ограничить. Как организовать базу в этом случае? Вижу два пути: 1) Создается единая база для всех пользователей, в нее входит N таблиц, в каждой записи таблиц указано IDпользователя. Для работы с данными пользователя (мы знаем его ID) программно формируется запрос select, который фильтрует записи по ID. 2) Для каждого пользователя создается свой набор N-таблиц. Тогда зная пользователя мы работаем только с его таблицами. У второго способа есть "-" пользователей много, поэтому таблиц тоже будет много Но есть и "+", можно легко получить размер дискового пространства, занимаемого данными пользователя (это нужно для лимитирования пользователей); второй "+": при программировании проще организовать разделение разделение доступа к данным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2007, 11:26 |
|
||
|
Покритикуйте организацию базы данных
|
|||
|---|---|---|---|
|
#18+
для каждого нового создавать новые таблицы? Если будет СУПЕР пользователь, которому понадобится знать всю информацию? или всю некоторой группы? Другое дело если информаций совершенно различна, пример: один вводит заказы от покупателей, другой: поступление материалов от поставщиков, третий: выпуск из производства ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2007, 11:32 |
|
||
|
Покритикуйте организацию базы данных
|
|||
|---|---|---|---|
|
#18+
Второй - вообще НЕ СПОСОБ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2007, 11:36 |
|
||
|
Покритикуйте организацию базы данных
|
|||
|---|---|---|---|
|
#18+
В описанной задаче, пользователь никак не пересекается с другими пользователями. Он вообще считает, что работает в системе один.... Суперпользователь может формировать запрос к нескольким таблицам сразу, т.е. к данным нескольких пользователей. честно скажу, меня тоже второй путь смущает, т.к. приходится плодить таблицы... но что-то сказать конкретно почему так нельзя делать, у меня не получается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2007, 12:08 |
|
||
|
Покритикуйте организацию базы данных
|
|||
|---|---|---|---|
|
#18+
Второй способ: 1. Может натолкнуться на ограничение SQL-сервера на количество таблиц. Если описанная задача (поступления, расходы + отчеты и необходимая аналитика) подразумевает хотя бы десяток таблиц, то сразу выходим на 10,000 таблиц, а будет еще больше. 2. Чрезвычайно сложен в сопровождении, если нужно слегка поменять структуру БД для задачи. Скрипт на ALTER тысячи таблиц представляете? А на пятисотой он обломается (скажем, юзер в тот момент сидел в таблице, заблокировал), и имеем полтыщи таблиц одной структуры, полтыщи другой. А вообще, в любом варианте, если это не домашняя бухгалтерия тысячи студентов, а сколько-нибудь реальные предприятия с хорошим оборотом, то я не представляю, какой нужен объем, чтобы вместить тысячу нормальных бухгалтерий, хотя бы за время в пределах срока исковой давности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2007, 13:51 |
|
||
|
Покритикуйте организацию базы данных
|
|||
|---|---|---|---|
|
#18+
NUraКаждый пользователь оперирует только своими данными, с данными других пользователей не пересекается, доступ к данным другого пользователя нужно ограничить. По опыту, я скептически отношусь к "не пересекается". Если не имеется в виду некое подчеркнутое юридическое или фактическое разделение - скажем, это не независимые люди, работающие в некоторой "веб-БД", то постепенно начинают пересекаться. NUra1) Создается единая база для всех пользователей, в нее входит N таблиц, в каждой записи таблиц указано IDпользователя. Для работы с данными пользователя (мы знаем его ID) программно формируется запрос select, который фильтрует записи по ID. В принципе нормальный способ, только нужно не "формируется select", а "работать через view или ХП". Это и удобнее, и надежнее. Ну а учитывая наличие в Ваших постах Oracle-доминанты, возникает вопрос, почему Вы избегаете стандартного решения от вендора. NUra2) Для каждого пользователя создается свой набор N-таблиц. Тогда зная пользователя мы работаем только с его таблицами. Тоже возможный способ со своими плюсами. Однако, существующая механика СУБД мало приспособлена для работы с такими структурами. В частности, придется либо отказываться от хранимого кода, либо тысячекратно его копировать (по сути, организовывать отдельные базы для каждого пользователя). В полном пролете окажется кэш запросов, да и кэш данных будет не столь эффективен. Сервер будет ставить блокировки, которые никто никогда не будет ждать. Запросы "ко всем данным" станет писать весьма тяжело. В общем - я бы задумался об этом способе только если бы обнаружил серьезные минусы в подходе номер 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2007, 14:13 |
|
||
|
Покритикуйте организацию базы данных
|
|||
|---|---|---|---|
|
#18+
планируется в качестве СУБД - MySQL спасибо всем за обсуждение! а так вообщем я сам склонился к варианту 1, но пока окончательно решение не принял... возможно есть путь №3 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2007, 14:42 |
|
||
|
Покритикуйте организацию базы данных
|
|||
|---|---|---|---|
|
#18+
> возможно есть путь №3 ? Конечно. И для начала нужно задачу нормальным образом сформулировать. Также есть путь номер четыре: использовать готовые решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2007, 15:04 |
|
||
|
Покритикуйте организацию базы данных
|
|||
|---|---|---|---|
|
#18+
Вариант 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2007, 15:24 |
|
||
|
Покритикуйте организацию базы данных
|
|||
|---|---|---|---|
|
#18+
Программист-ЛюбительВторой - вообще НЕ СПОСОБ.+1 Вместо кутерьмы с набором таблиц таблицами для каждого пользователя лучше сделать одну общую таблицу со столбцом, содержащим идентификатор пользователя. Ну или каким-то образом реализовать row-level security, если полномочия на доступ к каждой строке необходимо задавать сложным образом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 10:10 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=113&tid=1544259]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 340ms |

| 0 / 0 |
