У нас есть две таблицы: OriginalDocument и ProcessedDocument. В первом мы помещаем оригинальный, а не обработанный документ. После проверки и обработки (преобразуется в формат XML и анализируется) он помещается в таблицу ProcessedDocument. Обработанный документ может быть действительным или недействительным. Что имеет смысл: есть две разные таблицы для допустимых и недействительных документов или просто с столбцом "Valid"? Некоторые столбцы (~ 5-7) не имеют отношения к недопустимому документу. Сохранение как недопустимых, так и действительных документов также приведет к тому, что таблица документов будет заполнена столбцами "NULL" (если документ недействителен, информация, такая как номер документа, может быть неизвестна). Что еще мы должны учитывать и взвешивать при принятии этого решения?
Две разные таблицы или только одна с столбиком bool?
Ответ 1
Является ли документ действительным или недействительным, он по-прежнему является документом, поэтому он делает для каждого из них все в одной таблице.
Однако, если недействительный документ обрабатывается по-разному вашим приложением до того момента, когда он почти забыт (не запрашивается, обновляется и т.д.), затем разбивайте таблицы. Наличие двух типов документов вместе в одной и той же таблице не приведет к замедлению ваших запросов без каких-либо непосредственных преимуществ.
У меня есть таблица документов, где действительные и недопустимые документы хранятся вместе, но только потому, что приложение повторно представляет плохой документ пользователю и просит их исправить его.
Ответ 2
Мне кажется, что имеет смысл иметь бит-столбец, поскольку все документы фактически обработаны, просто некоторые из них были признаны недействительными. И в зависимости от количества столбцов, если у вас всего 5 или около того из 10-15 столбцов, которые не применяются, нет необходимости управлять двумя структурами для одних и тех же данных.
Теперь, еще одна вещь, на которую вы могли бы обратить внимание, - вам нужно регулярно получать информацию о действительных и недействительных документах одновременно? если это так, то вы действительно хотите его в одной таблице.
Если вам когда-либо не нужно запрашивать их вместе, или если документ "недействителен" вам больше не нужен, кроме истории, тогда имеет смысл переместить его в свою таблицу.
Ответ 3
Ничего себе, столько плохих советов и мифов о дизайне в одном вопросе трудно понять, с чего начать.
Это VLDB? вы говорите 100 из TB, 100 GB, 1-10 GB?
Является ли это неэффективной DB? Вам нужно выжать микросекунды?
Большинство советов склоняются к тем крайностям, где вы можете нарушить несколько основных правил ради производительности.
Более ранний плакат сказал:
"Является ли документ действительным или недействительным, это все еще документ, чтобы он делает для всех в той же таблице.
Он был на правильном пути. И в этом отношении, обрабатывал ли он или не обрабатывал его также документ. Я сильно сомневаюсь в первом расколе таблицы.
Затем он говорит:
"Наличие двух типов документов вместе в одной и той же таблице ничего, кроме замедления ваших запросов для никакой непосредственной выгоды."
Я не знаю, на чем основан этот совет. Если ваша РСУБД поддерживает индексы, больше данных будет иметь очень незначительную дополнительную стоимость при определенных размерах вашего индекса, потому что ваше дерево b-tree получает один уровень глубже. Если вы берете его выражение по номинальной стоимости, вы должны ограничить свою таблицу до n строк и продолжать создавать новые, потому что "больше данных в вашей таблице = более медленные запросы". Я понятия не имею, почему люди упорствуют в этом понятии. Если у вас есть запросы, которые REQUIRE выполняют полное сканирование таблицы для одного типа или другого, разрешите разделить разделы, а не новую таблицу. Для поиска строки в таблице с миллиардами строк требуется около 10 миллисекунд, чем в миллионной таблице строк, потому что индекс, вероятно, будет только одним глубже между ними.
Другой плакат сказал:
"5-7 столбцов, которые не относятся к Недействительные документы NOT NULL так действительны документы должны иметь их. На мой взгляд, с таким количеством столбцов пустой для недействительных документов, он оправдывает другую таблицу".
Я бы хотел, чтобы люди объясняли причины. КАК это оправдывает это? На каком основании вы примете это решение. Слишком много? Почему нет? Но 5 слишком много? Возможно, он предполагает, что вы используете древнюю СУБД с фиксированными длинами полей. Я не могу сказать. Если вы поместите столбцы с нулевым значением в конце строки, вы не будете платить за них. В середине - несколько лишних байтов. Если это ОГРОМНАЯ сделка, если вы действительно пытаетесь сделать эту таблицу с несколькими ТБ менее заметной... мы поговорим о вертикальном разделении... не всей новой таблице. Поскольку вы будете расширять длину n% строк, вам нужно будет тщательно выбрать ваш PCTFREE или как всегда ваша база данных делает это. Кроме этого, существует небольшая минута нулевых столбцов.
Итак, расскажите обо всех минусах из трех таблиц.
Я собираюсь предположить, что ваша таблица выглядит так:
A surrogate PK column with a unique index.
A candidate key column with a unique index.
a few foreign keys to 'lookup' tables.
Several data fields.
the 5-7 nullable columns that are filled if a document becomes invalid.
Первая проблема заключается в том, что у вас будет 3 PK во всех таблицах, чтобы убедиться, что ключ уникален... но нет кросс-таблицы, чтобы гарантировать уникальность во всех трех комбинированных. Если вы не стараетесь использовать свой подход к коду, который перемещает данные из одной таблицы в другую, вы можете иметь один и тот же документ дважды или более. Один раз в каждой таблице. Если у вас есть отдельная таблица для оригинала, обработана и недействительна, тогда вы не сможете этого добиться.
С тремя таблицами все ваши ограничения будут проверяться снова и снова. Когда вы вставляете в таблицу Original, PK проверяется, AK проверяется, проверяются FK, другие столбцы проверяются. Комната сделана во всех индексах для этих новых энтемий и, возможно, вызывает раскол блока. Теперь вы обрабатываете файл и удаляете запись из таблицы Original, все эти индексы страдают удалением, оставляя пустое место позади. Ваша вставка в следующую таблицу снова переносит всю стоимость первой вставки. Ваши индексы действуют, возможно, вызывая разрывы блоков, ваши ПК, АК и FK снова проверяются. Промойте полоскание повтора для недопустимой таблицы.
Теперь, что произойдет с вашей моделью данных, если вы примете эту парадигму, когда обнаружите, что бизнес нуждается в 4-м состоянии? Вы добавите 4-ю таблицу документов для тех, кто находится в состоянии без предупреждения, или отправил состояние. В конце концов, новое отправленное состояние имеет 5-7 столбцов, не требуемых другими состояниями.
И есть много запросов, которые становятся hoorible, чтобы писать и запускать с несколькими таблицами, с одной таблицей они четкие, сжатые и быстрые... размер таблицы будет действительно влиять только на Full Table Scans, которые мы пытаемся избегайте таблиц, подобных этим.
Я видел такие системы. Один из основных оперативных запросов: "Где мой документ?"
Вам нужно искать 3 таблицы, чтобы найти свое состояние. То, что большинство людей делает дальше, создает представление UNION ALL всех трех таблиц, чтобы облегчить множество вопросов. Если другой плакат думает, что ваши запросы замедляются с другими данными в вашей таблице, посмотрите, как они действительно замедляются, когда вы выполняете UNION ALL, чтобы выполнить одно и то же. 1 индекс блеска 3 в отличие от 3 указателей отрыва 2.
Пример/РЕДАКТИРОВАТЬ
Я работаю в торговой компании. Мы выполняем сделки с контрагентами. По бухгалтерским и юридическим причинам наша компания определяется как несколько компаний. Хорошо назовите их Trading, Holding, JointVenture. Наши контрагенты мы позвоним. JonesCo, SmithBarely, GoldSax.
Итак, если учесть, что внутренние компании имеют уникальный набор столбцов, а у контрагентов есть уникальный набор столбцов. Вы сказали бы, что правильная нормализация заставит их на две таблицы. Так что сделайте это.
INT_CO_T 1 Торговля 2 Холдинг 3 JointVenture
CNTR_PTY_T 1 JonesCo 2 Смит 3 GoldSax
Теперь мне нужна торговая таблица, где я сопоставляю транзакцию между нашей компанией (компаниями) и контрагентами
TRADE_T (Int_co_T.ID, Ctr_pty_T.ID, другие торговые столбцы)
Великий.
Упс, Бизнес говорит, что JointVenture будет выполнять сделки с торговлей. Кстати, это очень распространенный сценарий, это происходит постоянно. Торговый дом назвал бы эти сделки с книгами.
Теперь у меня осталось два выбора. (Три действительно), но.
1 заключается в том, что я мог бы сделать что-то очень глупое и разместить JointVenture и Trading в таблице Counterparty, чтобы моя таблица сопоставления все еще работала. Это приводит к кошмарным запросам, и я уверен, что те, кто участвует в этом разговоре, узнают. Или я могу создать отдельную таблицу сопоставления.. и это тоже приводит к некоторым объединениям, если я хочу видеть все сделки от данной компании.
Третий и лучший способ - создать единую таблицу как для контрагентов, так и для внутренних компаний, называемых Trading_entities или что-то еще. Теперь мне нужна одна таблица сопоставления для отображения внутренних или внешних сделок. Я могу легко видеть чистую позицию и чистое воздействие одним запросом, двумя таблицами. и др.
Если вы действительно повесили на поля с нулевым значением, вертикально разделите эту таблицу и используйте три таблицы. Но главная таблица будет иметь список и, самое главное, единственный ключ для любого подтипа участника торговли.
Ответ 4
Попробуйте сделать различие между логическим и физическим моделированием.
Даже если разница между двумя объектами составляет всего семь свойств, они логически отличаются друг от друга в этих семи элементах. В то же время они являются одними и теми же в других свойствах.
Способ логически представлять, что у него есть взаимно-однозначное отношение между двумя таблицами, и чтобы одна таблица хранила все общие свойства (суперкласс), а в другом (подклассе) сохраните идентификатор из суперкласса.
С точки зрения производительности это не так плохо:
- когда вы не заботитесь о том, с каким типом документа вы работаете с вами, запросите таблицу суперкласса (коэффициент усиления)
- когда вы знаете, что хотите найти только определенные свойства в таблице подкласса, вы будете работать только с этой таблицей (это может быть реальный выигрыш)
- вы заплатите цену только тогда, когда вам нужно присоединиться к двум таблицам (у объединений есть цена по сравнению с денормализованными структурами, такими как хранение всего в одной таблице).
- вы также заплатите цену при вставке записей подкласса, потому что вы будете вставлять в две таблицы (это может быть очень мало и/или оправдано)
В зависимости от процессов, которые вы моделируете, частоты этих запросов и других вещей (таких как безопасность для обоих объектов, права собственности, различия в правилах целостности), вы можете решить сохранить эту информацию в одной таблице в базе данных или в двух (в пограничных случаях может быть намного быстрее, а два табличных решения также могут быть денормализированы, например, вы все равно можете хранить информацию в основной таблице о типе документа, чтобы избежать объединения, если этот вид запроса ты беспокоишься).
Или, может быть, ваши решения по внедрению могут быть основаны на вашем выборе рамок приложения, и по этой причине вам может действительно понравиться работать с отдельной таблицей или наоборот (например, автоматическое создание форм ввода данных в таких рамках, как django-admin).
Что бы вы ни делали, осознайте разницу между логическим и физическим дизайном. В вашем логическом дизайне нормализуйте все - он окупится. В физической реализации делайте разные сценарии и - проверяйте, проверяйте, проверяйте свои собственные данные. Никогда не путайте порядок двух (логико-концептуальное и физико-практическое моделирование).
Ответ 5
Какая форма ваших запросов? Вы часто хотите иметь дело с групповыми (все?) Документами, независимо от того, действительны ли они? Или каждый запрос содержит только релевантные (или недействительные) документы.
Или вы хотите иметь дело с группами (независимо от действительности), но хотите часто выполнять дополнительную работу с действительными документами. Это может указывать на базовую таблицу и дополнительную таблицу, содержащую допустимые столбцы документа?
Ответ 6
Подумайте о OriginalDocuments как о промежуточной таблице. Он может меняться при изменении форматов ввода. И он будет содержать поля, которые недопустимы для импортированных ( "обработанных" ) документов, таких как дата импорта или описание ошибки импорта. И вы можете периодически чистить эту таблицу.
В отличие от OriginalDocument, таблица ProcessedDocument будет содержать только документы и поля, действительные для вашей системы, со всеми ограничениями проверки, индексами и связанной с ними бизнес-логикой. Структура изменится по мере изменения внутренней логики вашей системы.
Ответ 7
Еще одна вещь, которую вы, возможно, захотите принять во внимание, - это жизненный цикл и использование строк. Если недействительные документы очищаются регулярно, это может помочь сделать их в отдельных таблицах. Если атрибуты недействительных документов остаются ограниченными, но действительные документы получают новые столбцы, это также будет фактором в пользу отдельных таблиц. Поскольку сущности все более различаются по поведению и использованию, есть больше признаков того, что отдельные таблицы заслуживают внимания.