Как определить повторяющиеся элементы, собранные из нескольких каналов, и связать их с базой данных - PullRequest
1 голос
/ 25 ноября 2010

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

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

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

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

Как бы я идентифицировал поступившие дубликаты, не замедляя всю базу данных?Как бы я тогда выбрал одно объявление из всех дубликатов, а затем сохранил, на каких других сайтах показывается это объявление.

Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010

Проблема двоякая, и оба на вашей стороне.Когда вы поймете, как с этим справиться, записать код в программу (Java или SQL будет легко).Сначала я назову их, а затем найду решения.

  1. По какой-то неизвестной причине вы предположили, что сбор описаний продуктов с нескольких сайтов не приведет к сбору одного и того же продукта.

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

Решение

Это сжатая версия IDEF1X Стандарт для моделирования реляционных баз данных;часть re Идентификаторы.

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

  2. И вы не можете просто скопировать данныедругой сайт, вам нужно подумать о том, что ваш сайт требует для продуктов.Что ваша компания понимает под продуктом и как она идентифицирует продукт?

  3. Определите все столбцы и типы данных для столбцов.

  4. Укажите, какие столбцы являются обязательными, а какие - необязательными.

  5. Укажите, какие сильные Идентификаторы .Например.Manufacturer и Model;короткий Product Name, а не длинный Description (или может быть для вашей компании, длинное описание - это Идентификатор).Работайте со своими пользователями и работайте над этим.

  6. Вы обнаружите, что у вас действительно есть небольшой кластер таблиц около Product, например Manufacturer, ProductType, возможно Vendor и т. Д.

  7. Организуйте эти таблицы и нормализуйте их, чтобы не дублировать данные.

  8. Убедитесь, что вы относитесь к этимИдентификаторы с небольшим уважением.Выберите, который будет уникальным.Это Ключи-кандидаты .Вам нужно как минимум по одному на таблицу, а в Product будет более одного.Все идентификаторы, по которым будет производиться поиск, должны быть проиндексированы (уникальные или нет).Обратите внимание, что уникальные индексы не могут иметь значение Nullable, поэтому вы не можете выбрать дополнительный столбец.

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

  10. Возьмите лучший, самый стабильный (один, который не изменится) уникальный идентификатор, один из ключей-кандидатов, и сделайте так, чтобы Первичный ключ .

  11. Если и только если уникальный идентификатор, первичный ключ, который может быть составным ключом, очень длинный и поэтому не подходит для первичного ключа, который переносится вдочерние таблицы, затем добавьте a суррогатный ключ .Это будет столбец Id.Обратите внимание, что это дополнительный столбец и дополнительный индекс.Он не заменяет идентификаторы Product, ключей-кандидатов;они не могут быть удалены.

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

Feeds

  1. Вам нужен стол WebSite для управления каналами.

  2. Будет ассоциативная таблица (многие ко многим) между Product и WebSite.Давайте назовем это ProductSite.Он будет содержать только нашу ProductId и WebSiteCode. It may contain Price`.Содержимое действительно для одного цикла подачи.

  3. Загрузка каждого канала в промежуточную базу данных или схему, входящую таблицу ProductIn, возможно, по одному на исходный веб-сайт.Это просто плоский файл из внешнего источника.Добавьте столбец IsValid и установите значение по умолчанию в true.

  4. Затем напишите некоторый SQL, который сравнивает эту таблицу ProductIn с ее свободным и гибким содержимым с нашей таблицей Productс его сильными идентификаторами.

    • Я бы сделал несколько волн отдельных проверок, каждая из которых помечает ошибочные строки, а IsValid - ложь.В конце Вставьте строки IsValid в наш ProductSite.

    • Возможно, вам повезет, и уйдет с оптимистичным подходом.То есть, если вы найдете совпадение в нескольких важных столбцах, оно будет действительным.(отмените значение по умолчанию и обновите логическое значение IsValid).

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

  5. Повторите для каждого веб-сайта.

  6. Теперь заполните наш веб-сайт из нашей таблицы Product, используя информацию, в которой мы уверены, и покажите, на каких сайтах есть продукт для продажи.от ProductSite.

1 голос
/ 25 ноября 2010

Я не думаю, что это проблема кода или базы данных (пока). Вы говорите:

Проблема в том, что у предмета нет очевидного уникального идентификатора

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

Некоторые примеры данных, которые вы считаете дубликатами, могут помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...