Есть ли причина для столбца первичного ключа, который никогда не будет использоваться? - PullRequest
5 голосов
/ 18 октября 2010

У меня есть подпрограмма, которая будет создавать отдельные таблицы (Sql Server 2008) для хранения результатов отчетов, сгенерированных моим приложением (Asp.net 3.5). Каждый отчет должен иметь свою собственную таблицу, поскольку столбцы для таблицы будут различаться в зависимости от настроек отчета. Таблица будет содержать где-то между 10-5000 строк, редко более 10000.

Будут применяться следующие правила использования:

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

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

Обновление : Вот еще некоторые подробности об обрабатываемых данных, которые учитываются в текущем проектном решении по одной таблице на отчет:

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

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

Единственное, о чем я могу думать, - это иметь столбец ID (идентифицирующий ReportVersionID, соответствующий другой таблице), столбец ReferenceValues ​​(поле varchar, содержащее все значения Reference в указанном порядке, разделенные некоторым разделителем) и Столбец NumericValues ​​(аналогично ReferenceValues, но для чисел), а затем, когда я получаю результаты, помещаю все в специализированные объекты в системе, разделяя значения на основе определенного разделителя). Это кажется предпочтительным?

Ответы [ 6 ]

3 голосов
/ 18 октября 2010

Первичные ключи НЕ ДОЛЖНЫ для любой и всех таблиц данных. Правда, они обычно весьма полезны и отказываться от них неразумно. Однако , в дополнение к основным миссиям скорости (что, я согласен, несомненно, будет положительно затронуто), также уникальна. В связи с этим, оценивая уже принятые вами соображения, я хотел бы предположить, что единственная потребность в первичном ключе заключается в управлении ожидаемой уникальностью таблицы.

Обновление: В комментарии вы упомянули, что если вы сделали PK, он будет включать столбец Identity, который в настоящее время не существует и не нужен. В этом случае я бы советовал против ПК вообще. Как указал @RedFilter, суррогатные ключи никогда не добавляют никакого значения.

1 голос
/ 18 октября 2010

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

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

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

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

Примечания по другимрешения:

EAV модель

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

Подход XML / BLOB

может быть правильным для вас, если вы будете использовать данные в виде XML / BLOB на уровне представления (всегда читайте все строки, всегда пишите весь «объект» и, наконец, если вашему уровню представления нравится XML/ BLOBS)

РЕДАКТИРОВАТЬ: Кроме того, в зависимости от моделей использования, первичный ключ может действительно увеличить скорость поиска, и если я могу прочитать тот факт, чтоданные не будут обновляться, поскольку «они будут записаны один раз и прочитаны много раз», тогда есть большая вероятность, что это действительно перевесит стоимость обновления индекса на вставках.

1 голос
/ 18 октября 2010

Я бы упростил задачу, просто сохранив результаты отчета, преобразованные в json или xml, в столбец VARCHAR (MAX)

0 голосов
/ 18 октября 2010

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

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

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

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

0 голосов
/ 18 октября 2010

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

0 голосов
/ 18 октября 2010

будет ли 1 таблица для каждого прогона данного отчета или одна таблица для всех прогонов данного отчета?Другими словами, если у вас есть Отчет № 1, и вы запускаете его 5 раз в другом диапазоне данных, вы создадите 5 таблиц или все 5 прогонов отчета будут сохранены в одной таблице?

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

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

...