Как создать настраиваемую пользователем базу данных (например, создатель Zoho) в Rails? - PullRequest
9 голосов
/ 09 апреля 2010

Я изучаю Rails, и цель моих экспериментов - реализовать нечто похожее на Zoho Creator, Flexlist или Mytaskhelper, то есть приложение, в котором пользователь может создавать свою собственную схему и представления базы данных. Какова лучшая стратегия для достижения этой цели?

Я видел кое-что о Entity-Attribute-Value (EAV), но я не уверен, является ли это лучшей стратегией или есть ли поддержка в Rails для нее.

Если бы в Rails было какое-нибудь руководство по подобному проекту, было бы замечательно.

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

Ответы [ 5 ]

10 голосов
/ 16 апреля 2010

Ваша лучшая ставка будет MongoDB. Его легко выучить (потому что язык запросов - JavaScript), и он обеспечивает хранилище данных без схемы. Я хотел бы создать документ для каждой формы, который определяет структуру формы. Затем всякий раз, когда пользователь отправляет данные, вы можете поместить данные в общую структуру и сохранить их в коллекции на основе имени формы. В MongoDB коллекции похожи на таблицы, но вы можете создавать их на лету. Вы также можете создавать индексы на лету для ускорения поиска.

Проблема, которую вы пытаетесь решить, - это один из основных вариантов использования баз данных, ориентированных на документы, которым является MongoDB. Существует несколько других ориентированных на документы баз данных, но, на мой взгляд, MongoDB имеет лучший API на данный момент.

Прочтите учебник MongoDB Ruby , и я уверен, что вы захотите попробовать.

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

0 голосов
/ 15 апреля 2010

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

Кроме того, вы можете хранить свои данные в XML и генерировать схему XML для проверки.

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

0 голосов
/ 14 апреля 2010

Должна быть возможность генерировать таблицы базы данных, отправляя DDL-операторы непосредственно на сервер или динамически генерируя миграцию. Затем вы можете сгенерировать соответствующие модели ActiveRecord, используя Class.new (ActiveRecord :: Base) do ... end. В принципе это должно работать, но это должно быть сделано с некоторой осторожностью. Но это определенно не работа для начинающего.

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

0 голосов
/ 14 апреля 2010

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

0 голосов
/ 11 апреля 2010

Я думаю, что это не совсем то, что вы хотите, но это http://github.com/LeonB/has_magic_columns_fork, но, очевидно, это делает нечто похожее, и вы можете получить некоторую идею, чтобы начать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...