Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Архитектура БД
 
 автор: Читатель   (07.10.2011 в 13:51)   письмо автору
 
 

Здравствуйте, эксперты по построению баз данных. Никак не могу придумать человеческое решение такой задачи.

Есть БД с данными. Есть несколько сотен пользователей. Необходимо предоставить возможность пользователям вносить изменения в данные, но таким образом, чтобы эти изменения были доступны этому конкретному пользователю или всем, если поставлена соответсвующая отметка пользователем "показать всем" и изменения проверены модератором, но изменять данные в исходной таблице нельзя.


К примеру есть таблица: id, info - все видят одинаковую информацию. userid 25 решил дополнить для себя информацию в поле info и указал, что эти изменения должны быть доступны только ему, а userid 27 решил дополнить информацию в поле info и указал, что эта информация может быть доступна всем. Как построить дополнительные связанные таблицы наиболее оптимально?

  Ответить  
 
 автор: cheops   (07.10.2011 в 14:35)   письмо автору
 
   для: Читатель   (07.10.2011 в 13:51)
 

1) Что представляет собой информация в исходной таблице? Это монолитный текст или он разбит на какие-то структуры вроде параграфов?
2) Как выводится информация "для всех"? Это просто записи в конце основного текста или пользователь имеет возможность редактировать текст (удалять, добавлять, исправлять)?

  Ответить  
 
 автор: Читатель   (09.10.2011 в 00:13)   письмо автору
 
   для: cheops   (07.10.2011 в 14:35)
 

1) это набор полей, каждое из которых доступно для редактирования
2) может редактировать, удалять, добавлять, но только "для себя", для всех остальных эти изменения могут/не могут быть доступны только после проверки модератором.

  Ответить  
 
 автор: cheops   (09.10.2011 в 11:50)   письмо автору
 
   для: Читатель   (09.10.2011 в 00:13)
 

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

  Ответить  
 
 автор: Читатель   (10.10.2011 в 10:49)   письмо автору
 
   для: cheops   (09.10.2011 в 11:50)
 

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

да

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

Модератор выбирает или "лучший" или объединяет оба.

Чтобы было еще понятнее, эта БД не а-ля википедия, а внутренняя клиентская база для сотрудников.
Например, есть строка:
фамилия|Имя|Отчество|дата рождения|место проживания|комментарий|

Коваленко|Леонид|Леонидович|дата рождения неизвестна|место проживания неизвестно|говорить только на украинском|

Пользователь 1 вносит изменения "для всех" в поле дата рождения, модератор одобряет и все видят теперь:

Коваленко|Леонид|Леонидович|29.02.1972|место проживания неизвестно|говорить только на украинском|

Пользователь 2 вносит изменения "для себя" в поле комментарий: "Наташкин муж"
теперь все видят:
Коваленко|Леонид|Леонидович|29.02.1972|место проживания неизвестно|говорить только на украинском|

а Пользователь 2 видит:
Коваленко|Леонид|Леонидович|29.02.1972|место проживания неизвестно|говорить только на украинском, Наташкин муж|

  Ответить  
 
 автор: cheops   (10.10.2011 в 12:04)   письмо автору
 
   для: Читатель   (10.10.2011 в 10:49)
 

Пока видится так: есть главная таблица, матричная. Каждая запись снабжается уникальным первичным ключом. Есть еще одна таблица, где храняться записи пользователей, которая дублирует матричную таблицу и содержит поле для идентификатора поля и идентификатора матричной таблицы. Первичный ключ - по двум столбцам: пользователь и идентификатор матричной таблицы. Еще нужно поле для статуса: личный просмотр, запрос на статус "для всех". После одобрения запись переносится в матричную таблицу, а в пользовательской унитожается.

Причем выводить информацию нужно из обеих таблиц, сначала из матричной, потом личную. Т.е. пользователь 2 видит сначала что все
Коваленко|Леонид|Леонидович|29.02.1972|место проживания неизвестно|говорить только на украинском|
А потом дополнительную информацию
|||||Наташкин муж

А модератор пусть каждый раз творчески перерабатывает и объединяет данные или пусть пользователи в комментарии пишут более подробно что нужно сделать модератору - добавить в конце, заменить полностью текст. В общем нужно наладить хорошую переписку модераторов и тех, кто добавляет (большей частью ей пользоваться не будут, но на начальных этапах для выработки правил внутри коллектива она потребуется).

  Ответить  
 
 автор: Читатель   (10.10.2011 в 13:48)   письмо автору
 
   для: cheops   (10.10.2011 в 12:04)
 

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

У матричной таблицы почти 300 пользователей (и это число постоянно растет), около 40 полей и несколько миллионов строк. Чаще всего пользователи будут вносить правки "для себя" (специфика работы).

Т.о. пользовательская таблица получится просто огромная. Т.е. если предположить максимальный вариант, то это кол-во строк в матричной умножить на количество пользователей (~ 3 000 000*300=900 000 000 строк), боюсь, что mysql просто умрет.

А если учесть, что при выводе около 5-ти связанных таблиц и могут быть очень сложные условия выборки и сортировки, то запросы получатся, мягко говоря, тяжеловатыми.

Это единственный вариант? :((

  Ответить  
 
 автор: cheops   (10.10.2011 в 17:02)   письмо автору
 
   для: Читатель   (10.10.2011 в 13:48)
 

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

  Ответить  
 
 автор: Читатель   (10.10.2011 в 17:10)   письмо автору
 
   для: cheops   (10.10.2011 в 17:02)
 

Другими словами, 300 персональных таблиц для пользователей лучше, чем одна, но в 300 раз тяжелее? Хм. Спасибо. Возможно и вариант. А MySQL от такого кол-ва таблиц не загнется? :))

  Ответить  
 
 автор: cheops   (10.10.2011 в 18:56)   письмо автору
 
   для: Читатель   (10.10.2011 в 17:10)
 

Если только речь не идет об InnoDB таблицах, которые храняться в едином табличном пространстве. Если это MyISAM таблицы будет 300 (ну 900) файлов в каталоге - это не много.

  Ответить  
 
 автор: Читатель   (10.10.2011 в 22:29)   письмо автору
 
   для: cheops   (10.10.2011 в 18:56)
 

да, MyISAM. Спасибо. Попробую.

Главное, не забывать, что "современный думающий человек периодически должен себе задавать такие вопросы, как "кто я?", "зачем я здесь?" и "давно ли я делал бэкапы?" :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования