Есть задача построения схемы б\д и каркаса классов бизнес логики на основании некоего описания (например в формате XML). Под воздействием различных материалов и конференций, прочитанных мною в последнее время, вырисовывается, на мой взгляд, интересная идея построения б\д. Хочется понять имеет ли эта схема хоть какие-то перспективы или лучше сразу выбросить её на помойку, не тратя время.
Кратко идея состоит в том, чтобы рассматривать атрибуты сущностей как связи с другими сущностями и хранить их в отдельных таблицах со связью один-к-одному.
Например есть сущность ПЕРСОНА, она имеет атрибут АДРЕС. Часто на первом этапе реализации этот атрибут становится строковым полем таблицы ПЕРСОНА.
Но в дальнейшем выясняется что атрибут АДРЕС есть и у других сущностей, например ОРГАНИЗАЦИЯ, кроме того вместо строкового поля появляется необходимость иметь структуру типа СТРАНА,ГОРОД,УЛИЦА и т.д. Конечно можно сказать, что об этом надо было думать еще на этапе проектирования, но легче от таких заявлений не становится. В предлагаемой схеме все атрибуты рассматриваются как связи с какими-либо сущностями . Т.е. схема будет выглядеть следующим образом:
PERSON( OID)
PERSON_ADDRESS( PERSON_OID,ADDRESS_OID)
PERSON_FNAME(PERSON_OID,STRINGDATA_OID)
PERSON_...
...
FIRM(OID)
FIRM_PRIMARY_ADDRESS(FIRM_OID,ADDRESS_ID)
FIRM_...
...
ADDRESS(OID)
ADDRESS_COUNTRY(ADDRESS_OID,COUNTRY_OID)
ADDRESS_CITY(ADDRESS_OID,CITY_OID)
ADDRESS_STREET(ADDRESS_OID,STRINGDATA_ID)
...
COUNTRY_...
...
CITY_...
...
STRINGDATA(OID,DATA varchar(255)) |
|
на первый взгляд данная схема имеет следующие недостатки:
1. Увеличение кол-ва таблиц и связей между ними
2. Усложнение написания запросов
3. Невозможность создания индексов по нескольким полям
4. Блокировки множества таблиц при изменениях данных
с другой строны имеются и преимущества:
1. единообразное представление сущностей и атрибутов (нет необходимости делать выбор - создавать таблицу или поле), мы изначаьно закладываем возможность изменения(я бы сказал эволюции) схемы б\д.
2. изменение структуры значительно проще чем при классическом подходе (можно менять как и состав атрибутов, так и их тип )
3. таблиц становится больше, но их размер уменьшается - это может увеличить производительность
4. при выборках и обновлениях используются только те таблицы которые затрагиваются этими операциями (т.е. пользователь меняющий атрибут PERSON_FIRSTNAME не мешает пользователю считывающему PERSON_ADDRESS) - это может сгладить недостаток 4
Недостатки 1 и 2 могут быть обойдены ситемой хранения описаний данных (метаданные) и средствами динамической генерации SQL запросов.
Недостаток 3 по-видимому может быть обойден с помощью материализованных представлений, хотя я с ними не работал, потому не могу судить.
Вероятнее всего такую схему рационально применять не для всего проекта, а для тех частей, которые подвергаются частым изменениям.
Поскольку я с такой структурой не работал, мне было бы интересно услышать мнение участников форума, особенно тех кто применял этот подход в реальных разработках.