Структура БД для автоматического развертывания нескольких приложений - PullRequest
9 голосов
/ 25 июня 2011

Я хочу создать приложение, похожее на basecamp или mailchimp.Клиент регистрирует себя сам, а затем автоматически настраивает приложение для себя.Приложение будет разработано с использованием CakePHP.

Мой вопрос: какова лучшая структура БД?

  • Все клиенты, разделенные идентификатором клиента в одной таблице.
  • Каждый клиент со своей собственной БД + Пользователь БД.
  • Используйте для каждого файла SQLite в своей папке.

Ответы [ 5 ]

6 голосов
/ 02 июля 2011

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

Подход 1 : база данных одного приложения; несколько таблиц в соответствии с функциональностью / структурой приложения, но таблицы содержат данные для всех пользователей. Например, comments, permissions, categories и т. Д.

плюсы : простая архитектура, простой и быстрый поиск и вставка

cons : операции с базой данных могут дорого обойтись, если таблицы станут слишком большими по размеру или будут содержать сложные индексы

Подход 2 : база данных для одного приложения; несколько таблиц в соответствии с функциональностью / структурой приложений; каждый пользователь имеет свой собственный набор таблиц, идентифицируемый, возможно, user_id. Например, для user_id = 1 таблицы могут быть comments_1, permissions_1, categories_1 и т. Д.

плюсы : опять простая архитектура; легко определить, какие таблицы запрашивать для конкретного пользователя; поскольку таблицы будут содержать данные только для конкретного пользователя, предложение WHERE будет как минимум на одно меньше меньше (где user_id = xx); меньшие таблицы и, следовательно, более быстрый поиск; меньше шансов на конфликты блокировок в рабочее время

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

Подход 3 : несколько баз данных приложений на пользователя

плюсы : 100% изоляция данных между пользователями; легко настраивать схему БД, если для пользователя требуется индивидуальная функциональность; легко распределить базы данных по нескольким серверам для балансировки нагрузки;

минусы : сложная архитектура; требует больше обслуживания; сложнее хранить общие или общие данные - данные могут быть либо реплицированы в каждую пользовательскую базу данных, либо может поддерживаться общая база данных.

Я думаю, что если схема эффективно спроектирована таким образом, что поддерживается баланс между более быстрыми SELECT / INSERT и количеством данных в таблице, первый подход должен хорошо работать для 100-10000 пользователей. Однако для этого потребуется большая настройка базы данных и умные индексы.

С подходом 2 и 3 оба отлично работают, но, с моей точки зрения, подход 3 лучше, поскольку он дает вам большую гибкость. Для реализации может потребоваться некоторое время, но это не сложно

Кроме того, SQLite не подходит для такой реализации. Я предложу реляционную базу данных, такую ​​как MySQL.

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

1 голос
/ 25 июня 2011

Если вы собираетесь получить большой (масштабируемый) продукт, то SQLite, вероятно, не лучший выбор. Настоящая СУБД гораздо эффективнее. При этом, если вы действительно собираетесь масштабировать, Cake может быть не самым эффективным вариантом. Это решения, которые вы должны принять на основе вашей бизнес-модели. Хорошо иметь стремления, но редко можно стать гориллой в 10 000 фунтов ... каламбур.

В моей компании есть приложение для автоматизации маркетинга для десятков клиентов, которое использует общую БД для общих функций и отдельную БД для уникальных данных. Да, он работает, и на самом деле он довольно эффективен и хорошо справляется с разделением данных, поэтому БД не выходит из-под контроля .... На самом деле, в общей базе данных есть таблицы с миллионами записей. Тем не менее, отслеживание вашей связи НАМЕРЕНО и чаще всего является причиной наших ошибок. Оставьте только один сеанс или создайте что-то не так и БУМ Это тост. Я часто сталкиваюсь с необходимостью полностью квалифицировать свои запросы, чтобы все заработало, что только усиливает стресс. Не думаю, что сделаю это снова.

Кроме того, с точки зрения громкости, поиск базы данных среди тысяч также не был бы моей идеей хорошего дня. Мне не нравится прыгать через 50, чтобы найти данные, необходимые для устранения неполадок.

С одной БД одно соединение просто работает. С точки зрения разработчика, это намного проще. Мне трудно сказать, какие преимущества дает производительность, потому что наше приложение больше всего страдает от ужасно неэффективной среды (устаревшая Symfony)

0 голосов
/ 08 июля 2011

Я настоятельно рекомендую вам использовать дизайн NoSQL. NonSQL означает масштабируемое нереляционное хранилище данных без объединений и с легкой семантикой. Подход NonSQL улучшит способ разработки приложений, зарабатывая новые модели и точки зрения на данные.

Базы данных NoSQL, как правило, используют память поверх диска в качестве первоклассного места записи: Redis и Memcached используются только в оперативной памяти, и даже такие системы, как Cassandra, используют memtables для записи с асинхронной записью на диск, предотвращая нестабильную производительность ввода-вывода из-за создавая узкие места скорости записи. А поскольку хранилища данных NoSQL обычно подчеркивают горизонтальную масштабируемость с помощью секционирования, это дает им прекрасную возможность воспользоваться преимуществами эластичной подготовки облака. NoSQL и облако естественны.

Какие у вас есть варианты?

NoSQL может дать вам лучшую производительность для определенных сценариев :

- Часто записываемые, редко читаемые данные, такие как счетчики посещений сети, или данные с регистрирующих устройств: Redis | MongoDB

- Часто читаемые, редко записываемые / обновляемые: Memcached для временного кэширования данных, Cassandra | HBase для поиска, Hadoop и Hive для анализа данных

- Приложения высокой доступности, требующие минимального времени простоя, хорошо работают с кластерными избыточными хранилищами данных: Riak | Cassandra

- синхронизация данных в нескольких местах: CouchDB

-Временные данные (веб-сеансы и кеши) хорошо работают в хранилищах временных значений ключей: Memcached

-Большие данные, полученные из бизнес-аналитики или веб-аналитики, которые могут не соответствовать какой-либо очевидной схеме: Hadoop

Комбинация?

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

0 голосов
/ 08 июля 2011

Я бы рекомендовал вам взглянуть на некоторые новые инновационные типы баз данных.Для огромных наборов данных нормальные базы данных SQL начинают отставать, так как объем данных становится выше определенного уровняВот почему Google создал их проект BigTable (http://en.wikipedia.org/wiki/BigTable).. Это также то, что стоит за движением NoSQL (http://en.wikipedia.org/wiki/NoSQL).

). Я рекомендую использовать MongoDB (http://en.wikipedia.org/wiki/MongoDB)..база данных NoSQL, которая хранит информацию объектно-ориентированным способом в коллекциях JSON-подобных документов. Сначала немного обернуть голову, но она работает и работает безумно быстро. У меня есть приятель, который запустил совершенно новыйсайт аниме, использующий MongoDB и Zend Framework, и его сайт работают так же быстро, как все, что может предложить Google, если не быстрее, и он работает на одном выделенном сервере.

Вы можете найти MongoDB по адресу http://www.mongodb.org/
Здесьэто руководство для вас, чтобы использовать его с CakePHP: http://mark -story.com / posts / view / using-mongodb-with-cakephp
Сайт MongoDB также имеет больше информации об этом: http://www.mongodb.org/display/DOCS/PHP+Libraries,+Frameworks,+and+Tools

0 голосов
/ 25 июня 2011

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

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