|
|
|
| Здравствуйте, эксперты по построению баз данных. Никак не могу придумать человеческое решение такой задачи.
Есть БД с данными. Есть несколько сотен пользователей. Необходимо предоставить возможность пользователям вносить изменения в данные, но таким образом, чтобы эти изменения были доступны этому конкретному пользователю или всем, если поставлена соответсвующая отметка пользователем "показать всем" и изменения проверены модератором, но изменять данные в исходной таблице нельзя.
К примеру есть таблица: id, info - все видят одинаковую информацию. userid 25 решил дополнить для себя информацию в поле info и указал, что эти изменения должны быть доступны только ему, а userid 27 решил дополнить информацию в поле info и указал, что эта информация может быть доступна всем. Как построить дополнительные связанные таблицы наиболее оптимально? | |
|
|
|
|
|
|
|
для: Читатель
(07.10.2011 в 13:51)
| | 1) Что представляет собой информация в исходной таблице? Это монолитный текст или он разбит на какие-то структуры вроде параграфов?
2) Как выводится информация "для всех"? Это просто записи в конце основного текста или пользователь имеет возможность редактировать текст (удалять, добавлять, исправлять)? | |
|
|
|
|
|
|
|
для: cheops
(07.10.2011 в 14:35)
| | 1) это набор полей, каждое из которых доступно для редактирования
2) может редактировать, удалять, добавлять, но только "для себя", для всех остальных эти изменения могут/не могут быть доступны только после проверки модератором. | |
|
|
|
|
|
|
|
для: Читатель
(09.10.2011 в 00:13)
| | Т.е. правильно ли я понимаю, что имеется возможность вообще удалить весь текст, написать совершенно другой и если модератор одобрит, в матрицу идет новый текст? А что происходит, если модератор приходит и видит два совершенно различных текста? У него есть полномочия, способности выбрать лучший? Ведь компиляцию в этом случае может сделать только человек, да и то не каждый? | |
|
|
|
|
|
|
|
для: cheops
(09.10.2011 в 11:50)
| | >Т.е. правильно ли я понимаю, что имеется возможность вообще удалить весь текст, написать совершенно другой и если модератор одобрит, в матрицу идет новый текст?
да
>А что происходит, если модератор приходит и видит два совершенно различных текста? У него есть полномочия, способности выбрать лучший? Ведь компиляцию в этом случае может сделать только человек, да и то не каждый?
Модератор выбирает или "лучший" или объединяет оба.
Чтобы было еще понятнее, эта БД не а-ля википедия, а внутренняя клиентская база для сотрудников.
Например, есть строка:
фамилия|Имя|Отчество|дата рождения|место проживания|комментарий|
Коваленко|Леонид|Леонидович|дата рождения неизвестна|место проживания неизвестно|говорить только на украинском|
Пользователь 1 вносит изменения "для всех" в поле дата рождения, модератор одобряет и все видят теперь:
Коваленко|Леонид|Леонидович|29.02.1972|место проживания неизвестно|говорить только на украинском|
Пользователь 2 вносит изменения "для себя" в поле комментарий: "Наташкин муж"
теперь все видят:
Коваленко|Леонид|Леонидович|29.02.1972|место проживания неизвестно|говорить только на украинском|
а Пользователь 2 видит:
Коваленко|Леонид|Леонидович|29.02.1972|место проживания неизвестно|говорить только на украинском, Наташкин муж| | |
|
|
|
|
|
|
|
для: Читатель
(10.10.2011 в 10:49)
| | Пока видится так: есть главная таблица, матричная. Каждая запись снабжается уникальным первичным ключом. Есть еще одна таблица, где храняться записи пользователей, которая дублирует матричную таблицу и содержит поле для идентификатора поля и идентификатора матричной таблицы. Первичный ключ - по двум столбцам: пользователь и идентификатор матричной таблицы. Еще нужно поле для статуса: личный просмотр, запрос на статус "для всех". После одобрения запись переносится в матричную таблицу, а в пользовательской унитожается.
Причем выводить информацию нужно из обеих таблиц, сначала из матричной, потом личную. Т.е. пользователь 2 видит сначала что все
Коваленко|Леонид|Леонидович|29.02.1972|место проживания неизвестно|говорить только на украинском|
А потом дополнительную информацию
|||||Наташкин муж
А модератор пусть каждый раз творчески перерабатывает и объединяет данные или пусть пользователи в комментарии пишут более подробно что нужно сделать модератору - добавить в конце, заменить полностью текст. В общем нужно наладить хорошую переписку модераторов и тех, кто добавляет (большей частью ей пользоваться не будут, но на начальных этапах для выработки правил внутри коллектива она потребуется). | |
|
|
|
|
|
|
|
для: cheops
(10.10.2011 в 12:04)
| | Я тоже изначально вижу этот вариант, но у меня возникает сомнение в его оптимальности.
У матричной таблицы почти 300 пользователей (и это число постоянно растет), около 40 полей и несколько миллионов строк. Чаще всего пользователи будут вносить правки "для себя" (специфика работы).
Т.о. пользовательская таблица получится просто огромная. Т.е. если предположить максимальный вариант, то это кол-во строк в матричной умножить на количество пользователей (~ 3 000 000*300=900 000 000 строк), боюсь, что mysql просто умрет.
А если учесть, что при выводе около 5-ти связанных таблиц и могут быть очень сложные условия выборки и сортировки, то запросы получатся, мягко говоря, тяжеловатыми.
Это единственный вариант? :(( | |
|
|
|
|
|
|
|
для: Читатель
(10.10.2011 в 13:48)
| | Видел вариант, сам иногда им балуюсь... название таблицы для каждого пользователя хранится в поле таблицы пользователей, в результате каждый из пользователей имеет свою собственную таблицу. С точки зрения организации базы данных это не гуд, но ускоряет выборку очень здорово. | |
|
|
|
|
|
|
|
для: cheops
(10.10.2011 в 17:02)
| | Другими словами, 300 персональных таблиц для пользователей лучше, чем одна, но в 300 раз тяжелее? Хм. Спасибо. Возможно и вариант. А MySQL от такого кол-ва таблиц не загнется? :)) | |
|
|
|
|
|
|
|
для: Читатель
(10.10.2011 в 17:10)
| | Если только речь не идет об InnoDB таблицах, которые храняться в едином табличном пространстве. Если это MyISAM таблицы будет 300 (ну 900) файлов в каталоге - это не много. | |
|
|
|
|
|
|
|
для: cheops
(10.10.2011 в 18:56)
| | да, MyISAM. Спасибо. Попробую.
Главное, не забывать, что "современный думающий человек периодически должен себе задавать такие вопросы, как "кто я?", "зачем я здесь?" и "давно ли я делал бэкапы?" :) | |
|
|
|