Отключить генераторы модульного тестирования в Rails

Нормализация ваших операционных таблиц , как это предлагает Transact Charlie, является хорошей идеей и с течением времени сэкономит много головных болей и проблем, но есть такие вещи, как таблицы interface , которые поддерживают интеграцию с внешними системами и отчетности таблиц, которые поддерживают такие вещи, как аналитическая обработка; и эти типы таблиц должны не обязательно быть нормализованы - на самом деле очень часто намного, гораздо удобнее и результативнее для них не быть .

В этом случае я думаю, что предложение Transact Charlie для ваших рабочих таблиц является хорошим.

Но я бы добавил индекс CompetitorName в таблицу CompetitorsNode (не обязательно уникальный) для поддержки эффективных объединений в CompetitorName для целей интеграции (загрузка данных из внешних источников), и я бы поставил интерфейс таблица в микс: Конкурсные результаты.

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

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

Одна вещь, которую я хотел бы отметить - на самом деле, мне кажется, имя конкурента очень маловероятно, чтобы быть уникальным в ваших данных . Например, у 200 000 конкурентов у вас может быть 2 или более Дэвида Смита. Поэтому я бы рекомендовал вам собрать больше информации от конкурентов, таких как их номер телефона или адрес электронной почты, или нечто более вероятное, чтобы быть уникальным.

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

Итак, у соревнований должны быть некоторые «старые» и «новые» поля - oldEmail, newEmail, oldPhone, newPhone и т. д. Таким образом, вы можете сформировать составной ключ в Конкуренты, от имени конкурента, электронной почты и телефона.

Затем, когда у вас есть некоторые результаты конкурса, вы можете усекать и перезагружать таблицу CompetitionResults из своего листа excel или любого другого, что у вас есть, и запускать единую эффективную вставку вставьте всех новых конкурентов в таблицу конкурентов и однократное эффективное обновление, чтобы обновить всю информацию о существующих конкурентах от результатов конкурса. И вы можете сделать одну вставку для вставки новых строк в таблицу CompetitionCompetitors. Эти вещи могут быть выполнены в хранимой процедуре ProcessCompetitionResults, которая может быть выполнена после загрузки таблицы CompetitionResults.

Это своего рода рудиментарное описание того, что я видел много раз в реальном мире с Oracle Приложения, SAP, PeopleSoft и список стилей других пакетов корпоративного программного обеспечения.

Один последний комментарий, который я сделал бы, - это тот, который я сделал ранее в SO: Если вы создаете внешний ключ, который гарантирует, что Конкурент существует в таблице «Участники», прежде чем вы сможете добавить к нему конкуренцию в CompetCitors, , чтобы убедиться, что для внешнего ключа установлено каскадное обновление и удаляется . Таким образом, если вам нужно удалить участника, вы можете это сделать, и все строки, связанные с этим конкурентом, автоматически удаляются. В противном случае, по умолчанию, внешний ключ потребует, чтобы вы удалили все связанные строки из CompetCompetitors, прежде чем он позволит вам удалить конкурента.

(Некоторые люди считают, что некаскадные внешние ключи являются хорошей мерой предосторожности, но мой опыт заключается в том, что они всего лишь огромная боль в прикладе, которые чаще всего являются результатом недосмотра и они создают кучу работы для DBA. Работа с людьми, случайно удаляющими вещи, - это то, почему у вас есть такие вещи, как «вы уверены», диалоги и различные типы регулярных резервных копий и избыточных источников данных. Далеко, гораздо чаще встречается желание удалить конкурент, чьи данные все испорчены, например, чтобы случайно удалить его, а затем пойти «О нет! Я не хотел этого делать! И теперь у меня нет результатов конкурса! Аааах!» последнее, конечно, достаточно распространено, поэтому вам нужно быть готовым к этому, но первый гораздо более распространен, поэтому самый простой и лучший способ подготовки к первому, imo - просто сделать каскадные обновления и удалять внешние ключи. )

16
задан matsko 13 December 2011 в 23:22
поделиться