Zastanawiam się nad przepisaniem aplikacji lokalnej VB (zainstalowanej lokalnie) (fakturowanie + inwentaryzacja) jako aplikacji Clojure dla małych firm. Zamierzam to zaoferować jako aplikację SaaS dla klientów w podobnych branżach.
Patrzyłem na opcje bazy danych: Moim wyborem był RDBMS: Postgresql / MySQL. Mogę skalować do 400 użytkowników w pierwszym roku, z zwykle 20-40 odsłonami na dzień na użytkownika - głównie w przypadku transakcji, które nie są widokami statycznymi. Każdy widok będzie wymagał pobierania danych i aktualizacji danych. Zgodność z ACID jest konieczna (a przynajmniej tak mi się wydaje). Więc wolumen transakcji nie jest ogromny.
Wybór jednego z nich na podstawie moich preferencji byłby oczywisty, ale w przypadku tego jednego wymagania, które moim zdaniem jest typowe dla aplikacji SaaS: schemat będzie się zmieniać wraz z dodawaniem większej liczby klientów / użytkowników i dla każdego klienta zmiana wymagań biznesowych (będę oferować pewną ograniczoną elastyczność tylko na początek). Ponieważ nie jestem ekspertem od DB, w oparciu o to, co mogę myśleć i czytać, mogę sobie z tym poradzić na wiele sposobów:
- Posiadaj tradycyjny projekt schematu RDBMS w MySQl / Postgresql z jednym DB obsługującym wielu najemców. I dodaj wystarczającą liczbę swobodnie zmieniających się kolumn w każdej tabeli, aby umożliwić przyszłe zmiany w miarę dodawania kolejnych klientów lub zmian dla istniejącego klienta. Może to mieć wadę propagowania zmian w bazie danych za każdym razem, gdy wprowadzana jest niewielka zmiana w schemacie. Pamiętam, że czytałem, że w schemacie Postgresql aktualizacje można wykonywać w czasie rzeczywistym bez blokowania. Ale nie jestem pewien, jak bolesne lub praktyczne w tym przypadku użycia. A także, ponieważ zmiany schematu mogą również wprowadzać nowe / drobne zmiany SQL.
- Posiadaj RDBMS, ale projektuj schemat bazy danych w elastyczny sposób: z wartością zbliżoną do atrybutu encji lub po prostu jako magazyn klucz-wartość. (Na przykład dzień roboczy, FriendFeed)
- Miej wszystko w pamięci jako obiekty i okresowo przechowuj je w plikach dziennika (np. Edval, lmax)
- Wybierz DB NoSQL, takie jak MongoDB lub Redis. Ale w oparciu o to, co mogę zebrać, nie nadają się do tego przypadku użycia i nie są w pełni zgodne z ACID.
- Wybierz niektóre DBS NewSQL, takie jak VoltDb lub JustoneDb (oparte na chmurze), które zachowują zachowanie zgodne z SQL i ACID i są RDBMS „nowej generacji”.
- Patrzyłem na neo4j (graphdb), ale nie jestem pewien, czy to pasuje do tego przypadku użycia
W moim przypadku zastosowania, oprócz skalowalności lub przetwarzania rozproszonego, szukam lepszego sposobu na osiągnięcie „Elastyczności w schemacie + ACID + pewnej rozsądnej wydajności”. Większość artykułów, które mogłem znaleźć w sieci, mówi o elastyczności schematu jako przyczynie prowadzącej do wydajności (w przypadku baz danych NoSQL) i skalowalności, pomijając stronę ACID / Transakcje.
Czy jest to przypadek „albo” albo „transakcji schematu vs ACID”, czy jest lepsze wyjście?