Преимущества вертикального разделения стола - PullRequest
2 голосов
/ 18 января 2010

( Обратите внимание , что эта ситуация не совсем так, как есть, но я сделал это в качестве примера)

У меня есть объект в таблице с данными, которые обновляются каждые 5 секунд ( Кинематические данные : скорость, курс, широта, долгота и PositionTime), а также другие данные, которые обновляются с трудом, если когда-либо (Цвет, Марка, OriginTime).

альтернативный текст http://www.freeimagehosting.net/uploads/a67205e99e.jpg

Теперь мой начальник хочет, чтобы я разбил эти данные на отдельные таблицы в нашей базе данных (с отношением «один к одному») следующим образом:

альтернативный текст http://www.freeimagehosting.net/uploads/1c699bc3c5.jpg

Он делает звучание "очевидным", что так и должно быть, но действительно ли есть какие-то преимущества в том, чтобы эти данные были разделены, например, для вставки и обновления (например, если я добавлю индекс в Color или Make)?

Ответы [ 4 ]

5 голосов
/ 18 января 2010

Возможно, имеет смысл сделать вертикальное разбиение следующим образом. Или нет.

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

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

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

Так что это звучит как потенциально бессмысленная оптимизация, которая, как и любая другая, должна рассматриваться на основе а) действительно ли существует проблема с производительностью (т.е. нужна ЛЮБАЯ оптимизация) и б) Является ли эта конкретная оптимизация лучшим способом ее устранения?

Я думаю, что вероятность а) маловероятна, а б) также маловероятна, поэтому шансы на то, что это потребуется, примерно маловероятны.

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

1 голос
/ 18 января 2010

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

0 голосов
/ 18 января 2010

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

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

В первом случае вы просто нормализуете данные; во втором случае текущая структура данных, вероятно, наиболее эффективна.

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

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

  • По соображениям безопасности у вас может быть смесь конфиденциальных и не очень конфиденциальных данных, которые находятся в отношении 1: 1. Вы можете переместить конфиденциальные данные в другую таблицу с другим набором разрешений. Исторически не все платформы СУБД позволяли устанавливать разрешения на уровне столбцов.

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

Наконец, вы получаете вертикальное разделение за кулисами при определенных обстоятельствах (то есть это не является явным в схеме, но физическое хранилище работает таким образом). Например, многие платформы СУБД хранят большие объекты отдельно от обычных данных таблицы, что приводит к неявному вертикальному разделению таблицы.

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

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

0 голосов
/ 18 января 2010

Ваш босс прав. И это не имеет ничего общего с «разбиением», которое называется нормализацией.

Прочтите эту статью.

РЕДАКТИРОВАТЬ : Хорошо, «вертикальное разделение» - это хорошо известный термин, а нормализация - это один из методов вертикального разделения. Но в этом случае нормализация, кажется, является правильным ответом, который объясняет вопрос (Цитата: "... действительно ли есть какие-то преимущества в том, что эти данные разделены, как для вставки и обновления") Преимущества и недостатки нормализации очень хорошо известны. Статья в Википедии - хорошая отправная точка.

И, кстати, чтобы не разжечь пламя «Эрвин Смута»: «вертикальное разложение», похоже, не является здесь широко используемым термином. Правильно?

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