Нормалізація ваших операційних таблиць, як це запропонував Transact Charlie, є хорошою ідеєю і врятує багато головних болів і проблем з часом - але є такі речі, як таблиці інтерфейсів , які підтримують інтеграцію із зовнішніми системами, та таблиці звітів , які підтримують такі речі, як аналітичні обробка; і ці типи таблиць не повинні бути нормалізованими - адже дуже часто це набагато, набагато зручніше та ефективніше для них не бути .
У цьому випадку я думаю, що пропозиція Transact Charlie для ваших операційних столів є вдалою.
Але я додав би індекс (не обов'язково унікальний) до CompetitorName у таблиці Competitors для підтримки ефективних приєднань до CompetitorName для інтеграції (завантаження даних із зовнішніх джерел), і я би вклав таблицю інтерфейсів у суміш: CompetitionResults.
Конкурсні результати повинні містити будь-які дані, що містять у вас результати змагань. Суть таблиці такої інтерфейсу, як ця, полягає в тому, щоб зробити її максимально швидкою і простою для обрізання та перезавантаження з аркуша Excel або файлу CSV або будь-якої форми, в якій ви маєте ці дані.
Ця інтерфейсна таблиця не повинна вважатися частиною нормованого набору операційних таблиць. Тоді ви можете приєднатися до CompetitionResults, як запропонував Річард, вставити записи в конкурентів, які вже не існують, та оновити ті, що є (наприклад, якщо у вас є додаткова інформація про конкурентів, наприклад їх номер телефону чи електронну адресу).
Я хотів би зазначити одне - насправді ім'я конкурента, як мені здається, дуже навряд чи буде унікальним у ваших даних . Наприклад, у 200 000 конкурентів ви можете мати 2 або більше Девіда Сміта, наприклад. Тому я рекомендую вам зібрати більше інформації від конкурентів, наприклад, їх номер телефону або адресу електронної пошти, або щось, що швидше за все буде унікальним.
Ваш операційний стіл, Конкуренти, повинен мати лише один стовпець для кожного елемента даних, який сприяє складенню природного ключа; наприклад, він повинен мати один стовпчик для основної адреси електронної пошти. Але таблиця інтерфейсів повинна мати слот для старих і нових значень для первинної адреси електронної пошти, щоб старе значення можна було використовувати для пошуку запису у конкурентів та оновлення цієї частини до нового значення.
Тож у конкурсних результатів повинні бути деякі "старі" та "нові" поля - oldEmail, newEmail, oldPhone, newPhone тощо. Таким чином, ви можете сформувати складений ключ у конкурентів від CompetitorName, Email та Phone.
Потім, коли у вас є деякі результати змагань, ви можете скоротити та перезавантажити свою таблицю CompetitionResults зі свого листа excel або будь-якого іншого, і запустити єдину ефективну вставку для вставки всіх нових конкурентів у таблицю конкурентів та єдине ефективне оновлення для оновлення. всю інформацію про існуючих конкурентів з конкурсних результатів. І ви можете зробити одну вставку, щоб вставити нові рядки в таблицю CompetitionCompetitors. Ці речі можна зробити в збереженій процедурі ProcessCompressionResults, яка може бути виконана після завантаження таблиці CompetitionResults.
Це своєрідний рудиментарний опис того, що я спостерігав у реальному світі за допомогою Oracle Applications, SAP, PeopleSoft та списку білизни інших програмних програм для підприємств.
Останнє зауваження, яке я зробив, - це те, що я робив раніше про SO: Якщо ви створюєте зовнішній ключ, який гарантує існування конкурента в таблиці конкурентів, перш ніж ви зможете додати рядок із цим конкурентом до нього, переконайтеся, що зовнішній ключ встановлюється для каскадного оновлення та видалення . Таким чином, якщо вам потрібно видалити конкурента, ви можете це зробити, і всі рядки, пов’язані з цим конкурентом, будуть автоматично видалені. В іншому випадку за замовчуванням зовнішній ключ вимагатиме видалення всіх пов’язаних рядків із конкурентів конкурентів, перш ніж він дозволить вам видалити конкурента.
(Деякі люди вважають, що не каскадні закордонні ключі є гарною запобіжною безпекою, але мій досвід полягає в тому, що вони просто страхітливий біль у попці, які частіше за все є просто результатом нагляду, і вони створюють купу робочих місць Для користувачів DBA. У взаємодії з людьми, які випадково видаляють речі, тому у вас є такі речі, як "Ви впевнені", діалоги та різні типи регулярних резервних копій та зайвих джерел даних. Насправді, набагато частіше зустрічатися з видаленням конкурента, чиї дані - все заплутався, наприклад, ніж випадково видалити його, а потім перейти "О, ні! Я не мав цього робити! І тепер я не маю їх результатів змагань! Аааах!" Останнє, звичайно, досить поширене, так вам потрібно бути готовим до цього, але це набагато частіше,тож найпростіший і найкращий спосіб підготуватися до першого, imo, - це просто зробити оновлення та видалення каскаду зовнішніх ключів.)
NVARCHAR(64)
стовпчик своїм основним (і таким чином: кластеризацією) ключем !! Перш за все - це дуже широкий ключ - до 128 байт; по-друге, це мінливий розмір - знову ж таки: не оптимальний ... Це про найгірший вибір, який ви можете мати - ваша продуктивність буде пекла, а фрагментація таблиць та індексів буде весь час на рівні 99,9% .....