В последнее время я прочитал немало статей, описывающих SQL и NoSQL с обеих сторон разрыва, таких как http://use-the-index-luke.com/blog/2013-04/whats-left-of-nosql. Эти статьи очень часто затрагивают предметы, такие как ACID и масштабируемость. Тем не менее, ряд вопросов, которые я обычно имею с SQL, как правило, редко упоминаются в этих статьях, и мне было интересно, почему и что это связано с тем, что я не совсем понимаю SQL. Если кто-нибудь сможет просветить меня, по крайней мере частично, по одному или нескольким из следующих пунктов, я бы очень признателен.
Мои проблемы с SQL:
- SQL по своей сути небезопасен: SQL - это язык, который был сделан для вставки и не имеет каких-либо методов предотвращения вставки кода вместо данных. Единственный способ предотвратить вставку - полностью изолировать SQL от приложения, используя его. Почему это еще не было разрешено в самом SQL?
- Кажется, что SQL был сделан для наименьшего размера памяти для данных, содержащихся в нем. Хотя это все еще имеет большой смысл для огромных объемов данных, оно больше не подходит для небольших баз данных или делает это?
- SQL заставляет все подогнать двухмерную реляционную модель, а конкретные таблицы отношений - для других измерений. Для меня это представляет собой две проблемы:
- согласованность данных полностью зависит от таблиц отношений
- данные очень трудно понять людям в случаях сбоев.
- SQL не поддерживает историю, поскольку по умолчанию она выполняет деструктивные обновления: есть, конечно, всевозможные способы создания истории, но для этого требуются специальные письменные материалы с дополнительными таблицами и использование штампов времени или запись новый рекорд для каждого изменения, что приводит к экспоненциально растущим размерам таблиц.
- SQL, похоже, предпочитает потерю данных для потери согласованности: если возникает ошибка или потеря согласованности, единственным способом восстановления ситуации в постоянном состоянии является использование резервной копии, что означает, что последние изменения будут уничтожены. Это отчасти из-за отсутствия истории (см. 4), но также из-за отсутствия читаемости для человека нет реального способа заставить человека исправить ошибки.
- Особенно в веб-среде использование SQL обычно означает, что модели создаются часто более одного раза. В обычном (простом) веб-приложении PHP дважды: один раз в PHP, один раз в SQL. В веб-приложении полного стека три раза: один раз в клиентском приложении, один раз в промежуточном программном обеспечении и один раз в базе данных SQL (если ORM не используется). Из-за разных языков программирования и различий типов между ними это означает, что между этими моделями существует множество возможных конфликтов. Я знаю, что ORM, такие как ActiveRecord и Django, решают хотя бы часть этих проблем, но объем дополнительной работы вам еще нужно сделать, потому что таблица SQL содержит VARCHAR (25) и ни один из используемых языков (JavaScript, Ruby, PHP, Perl, Python и т.д.) Знают, что такая конструкция огромна.
- Изменения структуры данных, по-видимому, рассматриваются как проблема согласованности: если что-то меняется в структуре данных, изменения таблицы применяются к каждой существующей записи в этой таблице, даже если запись не имела этого поля изначально и независимо от того, для этой записи имеет смысл иметь это поле. Набор этих изменений приводит к автоматическим переходам, которые добавляют еще один уровень возможных проблем, особенно в отношении согласованности.
- Смешивание логики хранения и логики приложения: SQL, похоже, хочет сожрать части логики приложения в качестве хранимых процедур (CouchDB также делает это через представления). Хотя я понимаю, что для некоторых типов операций вам нужна серверная сторона и очень строго контролируемые процедуры, я не понимаю, почему они хранятся в базе данных и как таковая часть механизма хранения, а не являются частью приложения ( промежуточный слой).
Я знаю (но не очень хорошо знаю) такие вещи, как PostgreSQL Hstore, но я не вижу полностью, как это решает то, о чем говорилось выше. Спасибо за любые идеи!