Я планирую переписать локальное (локально установленное) приложение на основе VB (выставление счетов + инвентаризация) в качестве веб-приложения Clojure для клиентов малого бизнеса. Я намерен предложить это как приложение SaaS для клиентов в аналогичной сфере.
Я искал варианты базы данных: мой выбор был RDBMS: Postgresql / MySQL. Я мог бы масштабировать до 400 пользователей в первый год, обычно с 20-40 просмотров страниц в день на пользователя - в основном для транзакций, а не статических просмотров. Каждое представление будет включать выборку данных и обновление данных. Соответствие требованиям ACID необходимо (или я так думаю). Так что объем транзакций невелик.
Было бы легко выбрать любой из них, исходя из моих предпочтений, но для этого одного требования, которое, я считаю, типично для SaaS-приложения: схема будет меняться по мере того, как я буду добавлять больше клиентов / пользователей и для каждого клиента изменение бизнес-требований (я буду предлагать ограниченную гибкость только для начала). Поскольку я не эксперт по БД, основываясь на том, что я могу придумать и прочитать, я могу справиться с этим несколькими способами:
- Иметь традиционную схему РСУБД в MySQl / Postgresql с одной БД, на которой размещено несколько клиентов. И добавьте достаточно «свободно плавающих» столбцов в каждую таблицу, чтобы учесть будущие изменения, поскольку я добавляю больше клиентов или изменения для существующего клиента. Это может иметь обратную сторону для распространения изменений в БД каждый раз, когда вносится небольшое изменение в Схему. Я помню, что читал, что в Postgresql обновления схемы можно выполнять в режиме реального времени без блокировки. Но не уверен, насколько больно или насколько это практично в этом случае использования. А также, поскольку изменения схемы могут также вводить новые / незначительные изменения SQL.
- Имейте RDBMS, но разрабатывайте схему базы данных гибким способом: с близким к значению атрибута объекта или просто как хранилище значения ключа. (Рабочий день, например FriendFeed)
- Храните все это в памяти как объекты и периодически сохраняйте их в лог-файлах (например, edval, lmax).
- Перейти на NoSQL DB, как MongoDB или Redis. Но исходя из того, что я могу собрать, они не подходят для этого варианта использования и не полностью совместимы с ACID.
- Выберите некоторые базы данных NewSQL, такие как VoltDb или JustoneDb (на основе облака), которые сохраняют поведение, совместимое с SQL и ACID, и являются СУБД нового поколения.
- Я посмотрел на neo4j (graphdb), но не уверен, что это подойдет для этого варианта использования
В моем случае использования, больше, чем масштабируемость или распределенные вычисления, я ищу лучший способ достижения «Гибкости в схеме + ACID + некоторая разумная производительность». Большинство статей, которые я мог найти в сети, говорят о гибкости схемы как о причине, приводящей к производительности (в случае NoSQL DB) и масштабируемости, оставляя при этом сторону ACID / Transactions.
Это случай «или» или транзакций «Гибкость схемы против ACID», или есть лучший выход?