BALD-D сражается против плохого дизайна баз данных - PullRequest
2 голосов
/ 12 июня 2009

Я не администратор баз данных, но я уважаю теорию баз данных. Разве добавление столбцов, таких как isDeleted и sequenceOrder, не плохо для базы данных?

Ответы [ 7 ]

13 голосов
/ 12 июня 2009

Это зависит. Возможность мягкого удаления кортежа (т. Е. Пометить его как удаленный, а не как фактическое удаление) крайне важна, если есть необходимость в последующем доступе к этому кортежу (например, для подсчета удаленных вещей или для какого-либо исторического анализа). Это также имеет возможное преимущество, в зависимости от того, как структурированы индексы, чтобы вызвать меньшее попадание трафика на диск при мягком удалении строки (из-за необходимости касаться меньшего количества индексов). Недостатком является то, что приложение берет на себя ответственность за управление внешними ключами для программного удаления.

Если мягкое удаление выполняется для повышения производительности, периодические (например, ночные, еженедельные) задачи могут очищать мягко удаленные кортежи в период низкого трафика.

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

5 голосов
/ 12 июня 2009

IsDeleted столбцы имеют две цели.

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

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

Не уверен, что такое SequenceOrder. Вы имеете в виду конкретное приложение?

3 голосов
/ 12 июня 2009

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

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

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

2 голосов
/ 12 июня 2009

Поскольку вы прямо заявляете, что вас интересует теоретическая перспектива, вот что:

На уровне ЛОГИЧЕСКОГО замысла почти обязательно нужно иметь логический атрибут в таблице (кстати, для теории правильным термином для этого является «relvar», а не «таблица»). Причина в том, что наличие логического атрибута делает очень неудобным определение / документирование значения (теория отношений называет это «Предикатом»), которое relvar имеет в вашей системе. Если вы включите логический атрибут, то предикат, определяющий такое значение relvar, должен будет включать в себя некоторую конструкцию, например «... и здесь -BOOLEANATTRIBUTENAME- этот кортеж был удален». Это неловкое обрезание.

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

На уровне ФИЗИЧЕСКОГО дизайна все может быть по-другому. Если у вас много операций удаления и восстановления, или даже большого количества действий по удалению, то физически наличие двух разных таблиц может оказаться плохой идеей. Одна таблица с логическим атрибутом, который действует как «отличительный ключ» между двумя логическими таблицами, действительно может быть лучше. Если, ооо, у вас много запросов, которым нужны только не удаленные, а объем удаленных, как правило, велик по сравнению с не удаленными, может быть, лучше разделить их и физически (и кусать сообщение о, вероятно, худшей производительности обновления, которую вы получите - если бы это было заметно).

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

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

2 голосов
/ 12 июня 2009

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

1 голос
/ 12 июня 2009

Остальные адекватно взялись за isDeleted.

Что касается sequenceOrder, бизнес-правила часто требуют, чтобы списки были в порядке, который не может быть определен фактическими данными.

Рассмотрим таблицу Приоритетных статусов. У вас могут быть строки для High, Low и Medium. Заказывая описание, вы получите либо High, Low, Medium или Medium, Low, High.

Очевидно, что этот порядок не дает информации о связи, существующей между тремя записями. Вместо этого вам понадобится поле sequenceOrder, чтобы оно имело смысл. Таким образом, вы получите [1] High, [2] Medium, [3] Low; или наоборот.

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

1 голос
/ 12 июня 2009

Подкрепляя сказанное другими, оба могут занять свое место.

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

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

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