Нормализация ваших операционных таблиц в соответствии с предложением Transact Charlie - хорошая идея, которая со временем избавит вас от многих головных болей и проблем, но есть такие вещи, как interface таблиц, которые поддержка интеграции с внешними системами и отчетными таблицами, которые поддерживают такие вещи, как аналитическая обработка; и эти типы таблиц не обязательно должны быть нормализованы - на самом деле, очень часто это намного, гораздо удобнее и эффективнее, чтобы их не было .
В этом случае, я думаю, предложение Transact Charlie для ваших операционных столов является хорошим.
Но я бы добавил индекс (не обязательно уникальный) к CompetitorName в таблице Competitors для поддержки эффективных объединений на CompetitorName в целях интеграции (загрузка данных из внешних источников), и я бы поместил интерфейсную таблицу в смесь : CompetitionResults.
CompetitionResults должен содержать любые данные, которые ваши результаты соревнований имеют в нем. Смысл интерфейсной таблицы, подобной этой, состоит в том, чтобы максимально быстро и просто обрезать и перезагружать ее из листа Excel, файла CSV или любой другой формы, в которой эти данные содержатся.
Эта интерфейсная таблица не должна рассматриваться как часть нормализованного набора операционных таблиц. Затем вы можете присоединиться к CompetitionResults, как предложено Ричардом, чтобы вставить записи в конкурентов, которые еще не существуют, и обновить те, которые делают (например, если у вас есть больше информации о конкурентах, например, их номер телефона или адрес электронной почты).
Я хотел бы отметить одну вещь - на самом деле, имя участника, как мне кажется, вряд ли будет уникальным в ваших данных . Например, из 200 000 участников у вас может быть 2 или более Дэвида Смита. Поэтому я бы порекомендовал вам собрать больше информации от конкурентов, например, номер телефона или адрес электронной почты, или что-то, что с большей вероятностью будет уникальным.
Ваша операционная таблица, Конкуренты, должна иметь только один столбец для каждого элемента данных, который вносит вклад в составной естественный ключ; например, он должен иметь один столбец для основного адреса электронной почты. Но в таблице интерфейса должен быть слот для значений old и new для основного адреса электронной почты, чтобы старое значение можно было использовать для поиска записи в Competitors и обновления этой части. это к новому значению.
Таким образом, CompetitionResults должны иметь несколько «старых» и «новых» полей - oldEmail, newEmail, oldPhone, newPhone и т. Д. Таким образом, вы можете сформировать составной ключ в Competitors, из CompetitorName, Email и Phone.
Затем, когда у вас есть некоторые результаты соревнований, вы можете обрезать и перезагрузить таблицу CompetitionResults из таблицы Excel или чего-то еще, и запустить одну эффективную вставку, чтобы вставить всех новых конкурентов в таблицу Конкурентов, и одну эффективную таблицу обновить, чтобы обновить всю информацию о существующих конкурентах из CompetitionResults. И вы можете сделать одну вставку, чтобы вставить новые строки в таблицу CompetitionCompetitors. Это можно сделать с помощью хранимой процедуры ProcessCompetitionResults, которая может быть выполнена после загрузки таблицы CompetitionResults.
Это своего рода элементарное описание того, что я много раз делал в реальном мире с Oracle Applications, SAP, PeopleSoft и списком других программных комплексов для предприятий.
Один последний комментарий, который я хотел бы сделать, - это тот, который я сделал ранее для SO: Если вы создаете внешний ключ, который гарантирует, что в таблице «Конкуренты» существует «Конкурент», прежде чем вы сможете добавить строку с этим «Конкурентом» в «CompetitionCompetitors», убедитесь, что внешний ключ установлен для каскадного обновления и удаляет .Таким образом, если вам нужно удалить конкурента, вы можете сделать это, и все строки, связанные с этим конкурентом, будут автоматически удалены.В противном случае по умолчанию внешний ключ потребует от вас удаления всех связанных строк из CompetitionCompetitors, прежде чем он позволит вам удалить Конкурента.
(Некоторые люди думают, что не каскадные внешние ключи - это хорошая мера предосторожности, но мой опыт показывает, что они просто ужасная боль в заднице, которая чаще всего не просто результат недосмотра, и ониСоздайте кучу рабочих заданий для администраторов баз данных. Работа с людьми, случайно удаляющими материал, - вот почему у вас есть такие вещи, как диалоги «Вы уверены» и различные типы регулярных резервных копий и избыточных источников данных.конкурент, чьи данные все испорчены, например, чем это случайно удалить один и затем сказать: «О, нет! Я не хотел этого делать! А теперь у меня нет результатов их соревнований! А-а-а-а!» Последнийэто, конечно, достаточно часто, поэтому вам нужно быть готовым к этому, но первое гораздо более распространено, поэтому самый простой и лучший способ подготовиться к первому, imo, это просто делать каскадные обновления и удаления внешних ключей.)