Поставлен в тупик и ищет вход Re: Дизайн базы данных - PullRequest
3 голосов
/ 09 июля 2009

У нас есть база данных Oracle, которая существует уже около 10 лет. Он проходит через лот рук. За эти годы он вырос довольно большой, и в его дизайне есть некоторые интересные аномалии, которые меня озадачили.

Теперь я исторически являюсь разработчиком SQL Server. Раньше я размышлял о различиях между Microsoft Way (tm) и Oracle Way (R). Теперь я понимаю, они просто разные. Я также выдергивал свои волосы и прислонял голову к столу, думая, что люди, которые приходили до меня, были слепыми, глухонемыми, измученными Джолтом и Ред Буллом, которые писали код в .NET Туретта.

(Да, я куда-нибудь иду.)

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

Так вот куда все это ведет меня:

  1. У нас есть несколько таблиц в базе данных, которые имеют двух отдельных владельцев. Оба владельца определяют идентичные ограничения первичного ключа для таблицы. Это меня озадачило. Зачем столу иметь несколько владельцев? И почему каждый владелец определяет отдельные, но идентичные первичные ключи?

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

  3. Мы также избежали ограничений внешнего ключа, таких как чума. Не уверен, почему мы сделали бы это. Есть ли причина избегать их в Oracle? Я вижу много причин, чтобы использовать их для обеспечения целостности данных между таблицами, и мы просто не используем их. Я предполагаю, что есть веская причина, и я просто не причастен к ней.

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

Для справки, мы все еще используем Oracle 9i.

Опять же, спасибо всем за терпение. Я старая рука Microsoft, поэтому время от времени разбивать свой мозг вокруг Oracle Way - непростая задача. Это большой зверь, с тоннами, которые нужно выучить, а иногда найти эту информацию в Интернете - непростая задача.

Благодарю Его Noodliness за StackOverflow.

Существенные точки после сообщения

  • Исторически мы не использовали последовательности, за исключением очень редких случаев.
  • Исторически мы не использовали хранимые процедуры или функции, за исключением очень редких случаев.
  • В очень старых документах есть ссылки на ERWIN. (Спасибо постеру ниже за то, что он мне запомнился.) Скорее всего, большая часть дизайна была произведена ORM, и естественный дизайн вытекает из этого.
  • Подавляющее большинство SQL выглядит жестко в приложении, и есть lot .
  • Я делаю все, что в моих силах, чтобы отвести нас от жестко запрограммированного SQL и поместить SQL в базу данных, к которой он относится. Но я пытаюсь сделать это так, чтобы это имело смысл, практично и не нарушало бизнес в процессе. (Читайте: только на новом программном обеспечении.)

Ответы [ 9 ]

2 голосов
/ 09 июля 2009

У нас есть несколько таблиц в базе данных, которые имеют двух отдельных владельцев. Оба владельца определяют идентичные ограничения первичного ключа для таблицы. Это меня озадачило. Зачем столу иметь несколько владельцев? И почему каждый владелец определяет отдельные, но идентичные первичные ключи?

Вы не можете определить два PRIMARY KEY на одной таблице в Oracle. Вы можете определить одну PRIMARY KEY и одну UNIQUE клавишу в одном наборе столбцов. Я не вижу смысла в таком дизайне.

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

В Oracle индекс не может использоваться для RANGE SCANS для чего-то, что не является крайним левым префиксом этого индекса.

Составной индекс для (col1, col2, col3) нельзя использовать для простого RANGE SCAN для col2 в одиночку или col3 в одиночку.

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

Если вы выполняете все взаимодействия с базой данных с помощью набора четко определенных процедур, оператор MERGE может дать гораздо лучшую производительность, чем FOREIGN KEY с ON DELETE CASCADE. Вы должны быть очень осторожны и привыкнуть к этой парадигме программирования.

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

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

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

Вы не хотите, чтобы вас видели курсорами вместо операций на основе множеств, не так ли?

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

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

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

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

1 голос
/ 09 июля 2009

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

Вы создаете индексы для ускорения запросов. Если вы запрашиваете "surname = 'Smith' и Given_name = 'john'", то лучше иметь один индекс для (фамилия, имя_данных), чем два отдельных индекса.

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

1 голос
/ 09 июля 2009

Как одна и та же таблица может принадлежать двум схемам. Это не имеет никакого смысла. Учитывая это, в заданных вами вопросах нет ничего плохого. Я разрабатываю большое приложение .net с базой данных Oracle, и у нас в команде превосходный администратор баз данных Oracle. Мы использовали ограничения внешнего ключа везде, где это возможно, для целостности данных. Триггеры используются только для получения нового значения из последовательности или для целей аудита, а не для какой-либо бизнес-логики. Мы использовали многоколоночные уникальные индексы для целостности данных и отдельные столбцы неуникальных индексов.

"В Oracle нельзя использовать индекс для ДИАПАЗОНА ДАННЫХ для чего-то, что не является крайним левым префиксом."

Я считаю, что это больше не так, как Oracle 10g.

0 голосов
/ 11 июля 2009

Предполагая, что вы не находитесь в ситуации с хранилищем данных здесь -

  • Внешние ключи обеспечивают ссылочную целостность и абсолютно необходимы. Я не могу вспомнить ситуацию, когда ты не хотел бы их.
  • Индексы снова являются очень важными инструментами для обеспечения производительности запросов.
  • Не уверен, почему они определяют PK без индексов - PK обычно реализуется через уникальный индекс.
  • Используя большие индексы, я предполагаю, что вы имеете в виду индексы, объединяющие несколько столбцов

Использование базы данных Oracle, разработанной ERWIN, не должно приводить к такому дизайну, так что то, что у вас есть, не является артефактом ERWIN.

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

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

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

0 голосов
/ 09 июля 2009

"У нас есть несколько таблиц в базе данных, у которых есть два отдельных владельца. Оба владельца определяют идентичные ограничения первичного ключа для таблицы. Это вызывает у меня недоумение. Почему у таблицы будет несколько владельцев? идентичные первичные ключи? "

База данных SQL Server больше соответствует пользователю / схеме Oracle. Таким образом, вы можете иметь несколько таблиц в одной базе данных Oracle, принадлежащих разным схемам / пользователям. Это РАЗНЫЕ таблицы (т.е. с разными данными внутри и потенциально разными столбцами / индексами ...).

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

0 голосов
/ 09 июля 2009

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

0 голосов
/ 09 июля 2009

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

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

О внешних ключах: поскольку база данных так сильно перешла в другие руки, мне интересно, не могли ли внешние ключи случайно быть отброшены где-нибудь вдоль линии. Я использовал разработчика PL-SQL, и некоторые, казалось бы, невинные операции (например, добавление / удаление столбца, я думаю, но я не уверен) привели к удалению всех внешних ключей.

0 голосов
/ 09 июля 2009
  • Много первичных ключей.

  • Мы также избежали ограничений внешнего ключа.

  • Избегайте использования триггеров.

Звукикак они использовали ORM для извлечения объектов из базы данных.Это означает меньшее количество сверхсложных объединений и операторов SELECT, а также более простые SELECTS.Это означает ограничения в коде, а не в базе данных.Точно так же поведение, похожее на «триггер» в коде.

Не похоже на Oracle.Похоже, приложение имеет ORM.

0 голосов
/ 09 июля 2009

Многим людям, в том числе и мне, не нравятся триггеры, потому что это затрудняет поиск и устранение неисправностей.

Это в значительной степени подводит итог моего мнения

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