DDL, чтобы определить правила денормализации? - PullRequest
2 голосов
/ 03 мая 2011

Я занимаюсь реляционными базами данных уже много лет, но в последнее время переехал на территорию Кассандры / Редиса. NoSQL имеет смысл для того, что мы делаем, так что все в порядке.

Сегодня, когда я работал над определением семейств столбцов Cassandra, у меня возник вопрос: почему в реляционных базах данных DDL не позволяет нам определять правила денормализации таким образом, чтобы сам механизм базы данных мог самостоятельно решать возникающие проблемы согласованности. Другими словами, когда программист по реляционным базам данных денормализуется для достижения целей производительности ... почему он / она затем остается поддерживать согласованность посредством специально написанного SQL?

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

EDIT:

Оцените обратную связь до сих пор. Я все еще чувствую, что у меня есть без ответа (возможно, потому что он был плохо сформулирован) вопрос на моих руках. Я понимаю, что материализованные представления пытаются предложить управляемую движком согласованность для денормализованных данных. Тем не менее, я понимаю, что они не обновляются немедленно с изменениями в базовых таблицах. Если это правда, это означает, что механизм действительно не управляет проблемами согласованности, возникающими в результате денормализации ... по крайней мере, не во время записи. Я имею в виду, что нормализованная структура данных без истинной, многофункциональной, управляемой движком денормализации затрудняет работу механизмов реляционных баз данных, когда приходит время масштабировать систему с большой нагрузкой чтения на сложные реляционные модели. Я предполагаю, что это правда, что регулировка частоты обновления материализованного представления эквивалентна настраиваемой «возможной согласованности», предлагаемой движками NoSQL, такими как Cassandra. Мне нужно прочитать о том, насколько эффективно движки могут синхронизировать свои материализованные представления. Чтобы считаться жизнеспособным относительно параметров NoSQL, время, необходимое для синхронизации представления, должно линейно увеличиваться с количеством добавленных / обновленных строк.

Во всяком случае, я подумаю об этом еще немного и отредактирую. Надеюсь, с некоторыми репрезентативными примерами воображаемого DDL.

Ответы [ 2 ]

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

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

В Oracle это называется materialized views, в SQL Server- indexed views.

По сути, это означает, что вы можете создать саморентифицированную денормализованную таблицу в результате запроса SQL и проиндексировать ее:

CREATE VIEW a_b
WITH SCHEMABINDING
AS
SELECT  b.id AS id, b.value, b.a_id, a.property
FROM    dbo.b b
JOIN    dbo.a a
ON      a.id = b.a_id

Полученное представлениеa_b, если бы это была реальная таблица, нарушило бы 2NF, поскольку property функционально зависит от a_id, который не является ключом-кандидатом.Однако система баз данных поддерживает эту функциональную зависимость, и вы можете создать составной индекс, скажем, для (value, property).

Даже MySQL и PostgreSQL, которые изначально не поддерживают материализованные представления, способны поддерживатькакие-то денормализованные таблицы.

Например, когда вы создаете индекс FULLTEXT для столбца или набора столбцов в MySQL, вы получаете два индекса одновременно: первый содержит по одной записи для каждогоотдельное слово в каждой записи (со ссылкой на исходную запись id), вторая содержит одну запись на каждое слово во всей таблице с общим количеством слов.Это позволяет быстро находить слова и упорядочивать их по релевантности.

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

Аналогичные действия выполняются для индексов GIN и GIST в PostgreSQL.

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

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

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

Денормализация в СУБД - это особый случай: не стандарт.Один делает это только тогда, когда у вас есть доказанный случай.Если вы проектируете денормализованные данные заранее, вы уже проиграли.

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

СУБД отличается от NoSQL тем, что она предназначена для работы с нормализованными проектами.ИМХО, вы не можете сравнить RDBMS и NoSQL, как это

...