Организация хранения сущностей с общим функционалом
От: stomsky Россия  
Дата: 19.05.11 04:46
Оценка:
Привет всем!
Не знаю куда запостить этот вопрос: в архитектуру или в базы данных. Вопрос по организации хранения данных.
Допустим у нас есть несколько сущностей, которые нужно хранить в базе данных. У этих сущностей часть атрибутов совпадает, часть различается.
Все сущности допускают некоторый единообразный функционал. Например (или/или/или):
1. Все рассматриваемые сущности поддерживают иерарахическое хранение (когда, связи между родительской и дочерней сущностями хранятся в отдельной таблице)
2. Все сущности поддерживают workflow с возможностью отката действия (придется хранить журнал workflow-транзакций, чтобы обеспечить откат именно в то состояние, в котором сущность была ДО выполнения откатываемого действия)
3. Все сущности поддерживают логирование выполняемых над ними действий с возможностью отыскать ту сущность, над которой выполнялось действие зафиксированное определенной строкой лога (очевидно, в таблице логов придется хранить ID-шник сушности, действию над которой соотвествует конкретная строка)
4. ...
Да бывает случаев, когда нужно обеспечить некую единообразную обработку сущностей, причем обработка эта потребует в базе данных специальной таблицы (или таблиц).
Причем, как правило, сущности слишком разные, чтобы засунуть их в одну таблицу.

Итак имеем: несколько таблиц для хранения сущностей.
Нужно обеспечить: выполнение некоторого функционала для сущностей, хранящихся в каждой из таблиц.

СОБСТВЕННО ВОПРОС: как правильнее организовать ту часть структуры базы данных (таблицы, хранимые процедуры), которая обеспечивает выполнение "общего" функционала?

Вижу следующие пути решения:
1. Для каждой таблицы сущностей завести свой набор таблиц и хранимок и проигнорировать тот факт, что в базе получается множество таблиц с практически одинаковой структурой и хранимок с почти одинаковым кодом. Явный минус: задолбаешься такое сопровождать (кодогенерация этот минус немного смягчает, но ИМХО весьма немного...).
2. Завести один экземпляр набора "общих" таблиц и хранимок для всех таблиц сущностей. Сущности по-прежнему хранятся каждая в своей таблице. В этом случае, вероятно, придется отказаться от внешних ключей между таблицами сущностей и таблицами "общего функционала".
3. Вынести общие атрибуты сущностей в отдельную таблицу, связать ее в отношении 1:1 с таблицами, содержашими остальные атрибуты сущностей. Общие таблицы и хранимки "завязываются" на одну общую таблицу. Мне этот вариант нравится больше всего, но "общие" таблицы становятся узким местом, а сущностей с "общим функционалом" может быть много (очень много).

Хочется узнать мнение более грамотных и опытных товарищей.

PS. Вопрос, в общем-то пока скорее теоретический, чем имеющий значение для текущего конкретного проекта. Но вопрос лично для меня ВАЖНЫЙ!
Красота — наивысшая степень целесообразности. (c) И. Ефремов
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.