2010-01-21 2 views
12

Когда дело доходит до порядка столбцов в таблицах БД, существуют ли какие-либо стандарты или, по крайней мере, лучшие практики?Порядок столбцов в таблицах базы данных

Вот ручной работы конвенции, что я следую:

  • первичный ключ (т.е. id);
  • уникальные колонны (то есть email, ssn);
  • внешние ключи (то есть article);
  • столбцы, содержащие пользовательские данные (то есть first_name, last_name);
  • колонок, содержащих системные данные;
    • non-boolean (т.е. password_hash);
    • булевы (т.е. deleted, verified)
  • временных меток столбцов (т.е. created_at);

Эти вопросы оставляют много вопросов без ответа, поэтому я хотел бы услышать ваши мысли.

+0

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

+0

Рекомендации по именам столбцов важнее, чем заказ IMHO. Я добавляю суффикс «_PK» к моим основным ключам и «_FK» к моим внешним ключам; взял привычку от другого парня базы данных. – Scott

ответ

6

Короче говоря, вы указали стандартные условные обозначения и вы не пропустите много. ИМО, единственный шаг, который заставит кого-то выглядеть непрофессиональным, не будет иметь Первичный ключ (ы). Наличие внешних ключей происходит сразу после того, как это хорошая конвенция, но не большая сделка. (Ключи многопрофильных первичные, которые включают в себя внешние ключи должны быть, конечно, в самом beginining, или кто-то должны быть побеждены.) Я хотел бы добавить два дополнительной мысль:

  1. Есть поля с подобными темами рядом друг с другом. Например, широко разделенные поля города/государства/почтового индекса были бы бесполезными. Я думаю, что это не имело бы значения ни в коем случае, было ли user_role или user_ip первым, но они звучат так, будто они должны быть рядом друг с другом.
  2. Вторично с другими такими соглашениями, это не повредит для вещей, которые должны быть в алфавитном порядке.

Имея дополнительные соглашения в вашей базе данных очень хорошая идея (например, как вы упоминаете всегда иметь метку в конце). Если у вас есть поля ChangeDate и ChangeBy во многих ваших таблицах, их правильное расположение (очевидно, рядом друг с другом и) хорошо.

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

Именование

Часто, когда вы решаете, порядок столбцов одно и то же время, вы решаете, на имена столбцов, поэтому я хотел бы обратиться к этому немного. Вы можете сделать ужасные, дорогостоящие ошибки с , назвав ваших полей; это гораздо важнее, чем упорядочение столбцов.Заказ можно легко изменить, но плохие имена вызовут проблемы навсегда. Это огромная боль, чтобы изменить имена таблиц и столбцов через год, когда есть десятки ссылок на них. Я просто добавил ответ here для решения этой очень важной темы.

+0

Я называю мои таблицы «somethings» (множественное число) и мой первичный ключ «что-то» (единственное). –

+0

Да, идеальный. Customers.CustomerID. Я работал с кем-то, кто префикс стандартных таблиц данных с * tbl * и имел несколько других префиксов. Готово, все в порядке, я думаю, но не обязательно. –

+0

nouI verThink nouPrefixes verAre adjmuch adjWorse conThan nouNot adj Обязательный. Я думаю, что они неаккуратные и беспорядочно загромождают базу данных. – ErikE

-1

Вы можете найти различные лучшие практики в сети.

Всегда сохранять CREATE TABLE заявления, наряду со всеми другими операторами , определяющих схему базы данных в безопасном месте. Каждый раз, когда вы делаете смену объекту базы данных, обязательно скачайте смену и проверьте его на программное обеспечение для управления версиями, например, Visual Source Safe.

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

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

Создание пользовательских таблиц в непервичной файловой группе; зарезервировать основной файл группу для системных объектов. Таким образом, предоставленная система и пользовательские объекты не конкурируют за ресурсы диска .

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

Создайте кластерный индекс на каждой странице . В каждой таблице может быть только один кластерный индекс . Если таблица содержит кластерный индекс, его данные физически сортируются в соответствии с кластеризованным ключевым ключом . Кластеризованные индексы в SQL Server имеют множество преимуществ. Например, если вы извлекаете данные из таблицы с использованием предложения ORDER BY , ссылающегося на кластерный индексный ключ, данные не нужно сортировать по адресу времени выполнения запроса.

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

Убедитесь, что кластерный индекс построен на столбец, который содержит различные

Источник: Creating SQL Server tables: A best practices guide

+1

Любая база данных, стоящая на ее соли, выведет существующую схему как текст ... по крайней мере postgres, mysql, ms-sql и oracle. –

+0

Снимите голосование за рекомендацию Visual SourceSafe за что угодно, особенно в 2010 году –

+0

@fuzzy lollipop: что вы рекомендуете вместо этого? Я ищу что-то, что интегрируется с базами данных SQL Server (в идеале с плагином для студии управления) – ErikE

6

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

Доказательства заднего значения NULL, снижающее пространство для хранения можно было на Deciphering a SQL Server data page:

... Нулевая растровый немного отличается (Fe/1111 1110), так как это теперь вторым столбец это нуль. Интересно, что в этой строке только один столбец переменной длины - это , а не два. Таким образом, есть конец только столбец одной переменной длины идентификатор индекса, 0d00/0x000d/13. Из этого можно сделать вывод, что столбцы обрабатываются в порядке, и, таким образом, один могли бы хотеть рассмотреть порядок столбцов, если конкретный столбец обычно null, возможно, более эффективный, чтобы он был заказан последним.

Обратите внимание, что это относится только к столбцам переменной длины. Хотя это явно включает varchar, varbinary и т. Д., Я не уверен в других типах данных (и у меня нет времени, чтобы окончательно определить это).

+0

+1, потому что я понятия не имел об этом! – ahsteele

+0

+1 Я тоже этого не делал. –

1

В MS Sql Server типы данных, текст и текст (все устаревшие), должны быть последними столбцами в строке, чтобы избежать штрафа за производительность.

Смежные вопросы