Схема динамической базы данных - PullRequest
63 голосов
/ 16 сентября 2008

Какая рекомендуемая архитектура для предоставления хранилища для динамической логической схемы базы данных?

Чтобы уточнить: где система должна предоставлять хранилище для модели, схема которой может быть расширена или изменена ее пользователями после ее производства, каковы хорошие технологии, модели баз данных или механизмы хранения, которые позволят это?

Несколько возможностей для иллюстрации:

  • Создание / изменение объектов базы данных с помощью динамически генерируемого DML
  • Создание таблиц с большим количеством разреженных физических столбцов и использование только тех, которые требуются для «наложенной» логической схемы
  • Создание «длинной, узкой» таблицы, в которой значения динамического столбца хранятся в виде строк, которые затем необходимо повернуть для создания «короткого, широкого» набора строк, содержащего все значения для конкретной сущности
  • Использование системы типов BigTable / SimpleDB PropertyBag

Будем весьма благодарны за любые ответы, основанные на опыте реального мира.

Ответы [ 16 ]

2 голосов
/ 28 сентября 2012

В Википедии есть отличный обзор проблемного пространства:

http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model

2 голосов
/ 16 сентября 2011

EAV подход, я считаю, это лучший подход, но он требует больших затрат

0 голосов
/ 13 сентября 2017

На вики-сайте c2.com была исследована идея «Динамического реляционного взаимодействия». Вам не нужен администратор базы данных: столбцы и таблицы создаются Create-On-Write, если только вы не начнете добавлять ограничения, чтобы заставить его работать более как традиционная СУБД: по мере развития проекта вы можете постепенно «заблокировать его».

Концептуально вы можете думать о каждой строке как о выражении XML. Например, запись сотрудника может быть представлена ​​как:

<employee lastname="Li" firstname="Joe" salary="120000" id="318"/>

Это не подразумевает, что он должен быть реализован как XML, это просто удобная концептуализация. Если вы запрашиваете несуществующий столбец, такой как «SELECT madeUpColumn ...», он считается пустым или пустым (если только добавленные ограничения не запрещают это). И можно использовать SQL , хотя нужно соблюдать осторожность при сравнении из-за модели подразумеваемого типа. Но помимо обработки типов пользователи динамической реляционной системы чувствовали бы себя как дома, потому что они могут использовать большую часть своих существующих знаний о РСУБД. Теперь, если кто-то просто построит это ...

0 голосов
/ 01 июля 2017

ElasticSearch. Это следует учитывать, особенно если вы имеете дело с наборами данных, которые можно разделить по дате, вы можете использовать JSON для своих данных и не использовать SQL для извлечения данных.

ES выводит вашу схему для любых новых полей JSON, которые вы отправляете, либо автоматически, с подсказками, либо вручную, которые вы можете определить / изменить с помощью одной команды HTTP («сопоставления»). Хотя он не поддерживает SQL, у него есть отличные возможности поиска и даже агрегации.

0 голосов
/ 16 сентября 2008

sql уже предоставляет способ изменить вашу схему: команда ALTER.

просто имеет таблицу со списком полей, которые пользователи не могут изменять, и пишет хороший интерфейс для ALTER.

0 голосов
/ 16 сентября 2008

В прошлом я выбирал вариант C - Создание «длинной, узкой» таблицы, в которой динамические значения столбцов хранятся в виде строк, которые затем необходимо поворачивать, чтобы создать «короткий, широкий» набор строк, содержащий все значения для конкретной сущности. . Тем не менее, я использовал ORM, и это действительно сделало вещи болезненными. Я не могу думать о том, как ты это сделаешь, скажем, в LinqToSql. Я думаю, мне нужно создать Hashtable для ссылки на поля.

@ Skliwz: Полагаю, он больше заинтересован в том, чтобы пользователи могли создавать пользовательские поля.

...