Подтвердить что ты не робот

Как бы вы создали свою базу данных, чтобы разрешить пользовательскую схему

Если вам нужно создать приложение вроде: пусть скажем, приложение для блогов, создание схемы базы данных относительно просто. Вам нужно создать несколько таблиц, tblPosts, tblAttachments, tblCommets, tblBlaBla... и что он (хорошо, я знаю, что немного упрощен, но вы понимаете, что я имею в виду).

Что делать, если у вас есть приложение, в котором вы хотите разрешить пользователям определять части схемы во время выполнения. Скажем, вы хотите создать приложение, в котором пользователи могут регистрировать любые данные. Один пользователь хочет зарегистрировать свое рабочее время (startTime, endTime, Id проекта, описание), следующий хочет собирать рецепты кулинарии, другие могут быть котировки акций, недельный вес их младенцев, ежемесячные расходы, которые они тратили на еду, результаты их любимые футбольные команды или все, о чем вы можете думать.

Как бы вы создали базу данных для хранения всех очень разных данных? Создаете ли вы общую схему, которая может хранить все виды данных, создаете ли вы новые таблицы, отражающие схему пользовательских данных, или у вас есть еще одна отличная идея?

Если это важно: я должен использовать SQL Server/Entity Framework

4b9b3361

Ответ 1

Повторите попытку.

Если вы хотите, чтобы они могли создавать свою собственную схему, то почему бы не построить схему, используя, о, я не знаю, CREATE TABLE statment. У вас есть полная лодка, полная функциональная, мощная база данных, которая может делать удивительные вещи, такие как определение схем и сохранение данных. Почему бы не использовать его?

Если вы просто собираетесь делать некоторые специальные свойства, то обязательно.

Но если это "карт-бланш, они могут делать все, что хотят", то пусть они.

Нужно ли им знать SQL? Умм, нет. Это ваша задача пользовательского интерфейса. Ваша работа как инструмент и разработчик приложений - это скрыть реализацию от пользователя. Итак, представляем списки полей, строк и стрелок, если вы хотите отношений и т.д. Что бы ни было.

Люди уже много лет делают "конечные пользователи", "простые" инструменты баз данных.

"Что делать, если они хотят добавить столбец?" Затем добавьте столбец, базы данных сделают это, по крайней мере, самые хорошие. Если нет, создайте новую таблицу, скопируйте старые данные, оставьте старый.

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

"Что делать, если у них есть одиннадцать миллионов рядов данных?" Затем у них есть одиннадцать миллионов рядов данных, и операции занимают одиннадцатьдесят миллионов раз дольше, чем если бы у них было 1 ряд данных. Если у них есть одиннадцать миллионов рядов данных, они, вероятно, не должны использовать вашу систему для этого в любом случае.

Увлечение "Реализация баз данных по базам данных" ускользает от меня.

"У меня есть Oracle здесь, как я могу предложить меньше возможностей и сделать медленнее для пользователя?"

Да, интересно.

Ответ 2

Невозможно предсказать, насколько сложны их требования к данным. Entity-Attribute-Value - это одно типичное решение, используемое многими программистами, но этого может быть достаточно, например, если пользовательские данные будут условно смоделированы с несколькими таблицами.

Я бы сериализовал пользовательские данные пользователя как XML или YAML или JSON или аналогичный полуструктурированный формат и сохранил его в текстовом BLOB.

Вы даже можете создавать инвертированные индексы, чтобы вы могли искать определенные значения среди атрибутов вашего BLOB. См. http://bret.appspot.com/entry/how-friendfeed-uses-mysql (эта методика работает в любой СУБД, а не только в MySQL).

Также рассмотрите использование хранилища документов, например Solr или MongoDB. Эти технологии не должны соответствовать соглашениям реляционных баз данных. Вы можете добавлять новые атрибуты в любой документ во время выполнения, без необходимости переопределять схему. Но это компромисс - отсутствие схемы означает, что ваше приложение не может зависеть от того, какие документы/строки похожи на всю коллекцию.


Я критик анти-шаблона Entity-Attribute-Value.

Я написал о проблемах с EAV в моей книге, SQL Antipatterns: избегайте ошибок программирования баз данных.

Здесь ответ SO, где я перечисляю некоторые проблемы с Entity-Attribute-Value: "Таблица продуктов, множество видов продуктов, каждый продукт имеет множество параметров.

Здесь блог, который я опубликовал на днях, с более подробным обсуждением проблем с EAV: "EAV FAIL.

И обязательно прочитайте этот блог "Bad CaRMa "о том, как попытка создания полностью гибкой базы данных почти уничтожила компанию.

Ответ 3

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

Здесь отличная статья о том, для чего вы находитесь:)

В качестве дополнительного комментария я заработал прототип для этого подхода, используя Linq2Sql за несколько дней, и это было приемлемым решением. Учитывая, что вы упомянули Entity Framework, я взглянул на версию 4 и их POCO support, так как это было бы хорошим способом для внедрения гибридной модели EAV без загрязнения вашей схемы EF.

Ответ 4

На поверхности нетривиальная или документально ориентированная база данных, такая как CouchDB или SimpleDB для идеальных звуков пользовательских данных. Но я думаю, что это мало помогает, если вы не можете использовать ничего, кроме SQL и EF.

Ответ 5

Я не знаком с Entity Framework, но я бы наклонился к базе данных Entity-Attribute-Value (http://en.wikipedia.org/wiki/Entity-Attribute-Value_model) модель.

Итак, вместо создания таблиц и столбцов "на лету" ваше приложение будет создавать атрибуты (или коллекции атрибутов), а затем ваши конечные пользователи будут заполнять значения.

Но, как я уже сказал, я не знаю, что должна делать Entity Framework для вас, и это может не позволить вам принять этот подход.

Ответ 6

Не как критический комментарий, но это может помочь сэкономить некоторое время, чтобы указать, что это одна из проблем типа Don Quixote Holy Grail. Там вечный поиск, вероятно, более 50 лет, чтобы создать удобный интерфейс для проектирования баз данных.

Единственные квази-успешные, которые получили какую-либо значительную тягу, о которой я могу думать, - это 1. Excel (и его предшественники), 2. Filemaker (оригинал, а не его текущий вкус) и 3. (возможно, но с сомнением). Обратите внимание, что первые два ограничены в основном одной таблицей.

Я был бы удивлен, если наша коллективная общепринятая мудрость поможет вам преодолеть барьер. Но было бы замечательно.

Ответ 7

Вместо того, чтобы повторно выполнять sqlservers "CREATE TABLE", который был сделан много лет назад командой программистов, которые, вероятно, были лучше вас или меня, почему бы не работать над тем, чтобы подвергать SQLSERVER ограниченным образом пользователям - пусть они создают свою собственную схему ограниченным образом и используют возможности SQLServer для правильной работы.

Ответ 8

Я просто дам им копию SQL Server Management Studio и скажу: "Иди орехи!". Зачем изобретать колесо внутри колеса?

Ответ 9

Отъезд post, вы можете это сделать, но это тяжелая работа:) Если производительность не является проблемой, решение xml могло бы работать тоже, хотя это также много работы.