Я займаюся як об’єктно-орієнтованим програмуванням, так і (в основному транзакційним, але деяким OLAP) дизайном баз даних, і, за моїх обставин, є багато повторюваних тем (принаймні, з OLTP).
Практика нормалізації 3nf допомагає мені практикувати якийсь варіант принципу єдиної відповідальності. Таблиця повинна представляти поняття у вашій системі - і поняття повинні стосуватися один одного таким чином, щоб вони намагалися наслідувати реальність; Наприклад, якщо я будую систему, де Клієнт може мати 0 або багато заходів, то я створюю таблицю клієнтів та таблицю активності. Таблиця активності має зовнішній ключ до таблиці Клієнта. Коли я будую збережені процедури, я б обов'язково використовував зовнішнє з'єднання для приєднання Клієнта та активності, оскільки бізнес-вимога, що Клієнт може мати 0 заходів.
Я також стежу за можливостями розширення за допомогою таблиць міст (посилання). Наприклад, якби я намагався представляти ділове правило, де книга може мати необмежену (змінну) кількість авторів, я створив би таблицю книг, таблицю автора та таблицю моста / посилання, яка має ключові посилання на обидва Книга та автор.
Крім того, я використовую сурогатні ключі на всіх таблицях (як правило, стовпчики ідентифікації, що автоматично збільшуються, але, можливо, Посібники - компроміс із посиланнями в коді полягає в тому, що вони займають більше місця в пам'яті, ніж просте ціле число), і я уникаю покладатися на природні ключі для мого пошук (за винятком таблиць Bridge / Link). За замовчуванням я також створюю індекси на загальних стовпцях із зовнішніми ключами та періодично переглядаю збережені процедури / системні запити, щоб оптимізувати стратегії індексації. Ще одна стратегія індексації, яку я використовую, - шукати місця в моєму коді, де я будую колекцію на основі стовпця пошуку, і додавати відповідні індекси до стовпців пошуку.