NoSQL или реляционный или оба - PullRequest
3 голосов
/ 30 апреля 2011

Я работаю над проектом, в котором мне нужно сохранить список друзей. После долгих раздумий и поиска в сети лучший способ сделать это - сохранить идентификатор пользователя и идентификатор друга в таблице.Но он уверен, что если проект рассчитывает достичь больших масштабов, этот метод не кажется очень хорошим.Большинство крупных компаний, таких как Google, Facebook, Twitter, также перенесли свои функции в базы данных nosql.Так разве не кажется, что, возможно, нам следует начать наш проект с этих баз данных NoSQL?

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

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

Хотите узнать мнение других о том, что может быть правильным подходом для этого?

Ответы [ 7 ]

4 голосов
/ 30 апреля 2011

Держитесь подальше от ORM в целом и ActiveRecord в частности.
Они обычно создают «долг развития» , что означает, что начало проекта выглядит легко.
И когда вы вложили средства в полную интеграцию с ORM и 80% проекта завершено,
вы начинаете видеть все граничные случаи, когда ваш ORM падает.

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

Что касается SQL против noSQL: я бы рекомендовал начать с базы данных SQL, затем, когда приложение будет расти, начните использовать некоторую стратегию кэширования (memcachedили, может быть, Redis).И только когда это решение исчерпано - начните искать части вашей логики базы данных, которые не требуют реляционной.

Базы данных noSQL служат списком очень специфических вариантов использования и не предназначены для обычного приложения..

3 голосов
/ 30 апреля 2011

Использовать базу данных SQL.

Когда вы начнете получать миллионы и миллионы пользователей в день, начните использовать какую-то базу данных NoSQL.

2 голосов
/ 01 мая 2011

edit Я вижу, что другие предлагают начать с SQL.Я хотел бы изменить свое предложение и сказать - поэкспериментируйте с небольшим проектом, таким как «маленький твиттер-клон» или «магазин с видеокассетами».Держите базу данных на многих узлах и пишите сценарии, которые заполняют вас данными.Сделайте это с Riak / Cassandra, а затем с каким-нибудь решением SQL.Вы найдете себе, что проще и быстрее./ edit

Я бы пошел с NoSQL (это то, что я делаю сейчас. Ранее я использовал MySQL в крупных проектах).Зачем?Его гораздо проще использовать, чтобы вы могли уделять больше внимания другим важным вещам (NoSQL заботится о большинстве проблем с хранением данных):

  • Вам не нужно определять схему, что также означаетвам не нужно его обновлять.В MySQL у меня были длительные простои из-за обновления системы.Добавление одного столбца / индекса заняло много времени.Таблицы имели всего несколько миллионов строк.

  • Вы запустите распределенную среду за несколько минут.В MySQL вам приходится вручную распределять данные между несколькими компьютерами (если вы не храните все на одном, что не очень хорошая идея).

  • Вы получаете гораздо лучшую производительность.С MySQL производительность действительно плохая.Просто не работает без memcached.Memcached - это распределенное хранилище значений ключей (простая база данных NoSQL).Очевидно, что использование memcached требует дополнительных затрат времени на оптимизацию запросов

  • Вам не нужно думать о нормализации / денормализации

  • Запросы просты (по крайней мере, в хранилищах ключей-значений).Вам просто наплевать на что-то вроде: я должен использовать «где UserId = 12345» или «где UserId =« 12345 »» (в MySQL один из них не будет использовать индексы!).

  • Если один из компьютеров с NoSQL выходит из строя, вас это не волнует в вашем приложении.Запрос будет выполнен на другой реплике (вам не нужно это реализовывать!)

Есть и недостатки использования NoSQL

  • Вы не получаете КИСЛОТУ.В большинстве случаев вам это просто не нужно!

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

  • Вы не можете выполнять определенные запросы - например, объединения не существуют, но если вы не нормализуете данные, то объединения бесполезны (и вы экономите время, поскольку вам не нужно думать о нормализации).

Отличная статья: http://labs.mudynamics.com/2010/04/01/why-nosql-is-bad-for-startups/

Мой совет - начать с NoSQL и придерживаться его.Вы должны взглянуть на базы данных на основе динамо, такие как Riak и Cassandra.Также попробуйте CouchDB (CoachBase).Это для большей части данных.Для дружеских отношений граф база данных хороший вариант.

1 голос
/ 02 мая 2011

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

Тем не менее, я думаю, что преждевременное масштабирование, вероятно, не очень хорошая вещь, если вы создаете новое веб-приложение (или какое-либо приложение с большими данными), обычно требуется некоторое время, пока вы не достигнете предела для всего, что требует NoSQL (пропускная способность) , память, производительность ...)

Лучший совет, который я могу вам дать, - это построить ваше приложение с абстракциями к модели данных (не ORM), поэтому, например, если вы хотите получить список друзей из user_id, я бы создал интерфейс для «хранилища друзей». который будет иметь метод fetch_friends(user_id):friend_ids, сохраняя хорошую абстракцию, вы можете поменять базовую реализацию, когда возникнет такая необходимость.

Я сам использовал этот метод для каких-то аналогичных целей при хранении пользовательских данных. Начал с MongoDB (мои данные были без схемы), когда нагрузка стала слишком большой для одного сервера (до того, как MongoDB получил надлежащее разделение), перешла на Riak и когда требовались лучшие SLA для клиентов (Riak не так уж надежен) перешел на какое-то правильное решение. Каждый шаг требовал больших затрат времени на разработку и интеграцию, но к тому времени у нас уже были ресурсы, чтобы сделать такой шаг.

ИМХО, если бы я был тобой, я бы начал с MySQL, чтобы мне не нужно было думать о долговечности, постоянстве или постоянстве, и менял их, когда я сталкивался с какой-то ударой.

1 голос
/ 30 апреля 2011

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

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

Для своих учетных записей они используют реляционные базы данных, я уверен в этом: -)

В конце концов, это будет зависеть от сложности вашей схемы: будет ли она достаточно простойпопробуйте nosql: гораздо проще в настройке, на самом деле вам вообще не нужно определять схему, вы просто устанавливаете свою запись (или документ, как ее называют некоторые из них) и сохраняете ее.Нет необходимости изменять таблицы, если вы передумаете относительно структуры таблиц: просто сохраните свои данные.Легко: вот почему так происходит сегодня.

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

0 голосов
/ 06 сентября 2012

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

0 голосов
/ 03 мая 2011

Обзор SQL и NoSQL: http://www.sigmod.org/publications/sigmod-record/1012/pdfs/04.surveys.cattell.pdf

"Таким образом, масштабируемые СУБД имеют преимущество перед хранилищами данных NoSQL, поскольку вы имеете удобство использования языка SQL более высокого уровня и свойств ACID, но платите за них только тогда, когда они охватывают узлы."

...