Как определить повторяющиеся элементы, собранные из нескольких каналов, и связать их с базой данных
У меня есть база данных, в которой хранятся сведения о продуктах, которые взяты со многих сайтов и собраны через API отдельных сайтов. Когда я вызываю канал, детали сохраняются в таблице базы данных.
Проблема, с которой я столкнулся, заключается в том, что, поскольку один и тот же товар указан на многих сайтах продавца, в моей базе данных появляются дубликаты, а затем, когда я показываю их на веб-странице, появляется много дубликатов.
Проблема в том, что у товара нет очевидного уникального идентификатора, у него есть конкретные детали товара (которых может быть много), а затем описание товара у продавца.
Я хотел бы, чтобы элемент появился один раз, а затем предоставил пользователю подробную информацию о том, где еще элемент указан.
Как бы я идентифицировал поступившие дубликаты, не замедляя всю базу данных? Как бы я тогда выбрал одно объявление из всех дубликатов, а затем сохранил, на каких других сайтах показывается это объявление.
Спасибо за любую помощь.
2 ответа
Проблема в два раза, и оба на вашей стороне. Когда вы поймете, как с этим справиться, записать код в программу (Java или SQL будет легко). Сначала я назову их, а затем найду решение.
По какой-то неизвестной причине вы предположили, что сбор описаний продуктов с нескольких сайтов не приведет к сбору одного и того же продукта.
Вы привыкли к общему и бессмысленному
Id
колонка, которая хороша, когда вы работаете с функциональностью прототипирования электронных таблиц; но это далеко не то, что требуется для базы данных или функциональности уровня разработки. Ваши пользователи (или начальник) естественно ожидали возможности базы данных от базы данных, а вы ее не предоставили. (И нет, он не требует нечеткой строковой логики или какой-либо магии.)
Решение
Это сжатая версия стандарта IDEF1X для моделирования реляционных баз данных; часть пере идентификаторов.
Вы должны думать в терминах базы данных и думать о таблицах базы данных, которые вам необходимы для выполнения вашей функции, что означает, что вам не разрешено использовать автоинкремент
Id
колонка. Этот столбец дает электронную таблицуRowId
, но это не подразумевает ничего о содержимом таблицы или столбцах, которые идентифицируют продукт.И вы не можете просто скопировать данные с другого сайта, вам нужно подумать о том, что ваш сайт требует для продуктов. Что ваша компания понимает под продуктом и как она идентифицирует продукт?
Определите все столбцы и типы данных для столбцов.
Определите, какие столбцы являются обязательными, а какие - необязательными.
Определите, какие сильные идентификаторы. Например.
Manufacturer
а такжеModel
; короткаяProduct Name
не долгоDescription
(или может быть для вашей компании, длинное описание является Идентификатором). Работайте с вашими пользователями и работайте над этим.Вы обнаружите, что у вас есть небольшой кластер столов вокруг
Product
, такие какManufacturer
,ProductType
возможноVendor
, так далее.Организуйте эти таблицы и нормализуйте их, чтобы не дублировать данные.
Убедитесь, что вы относитесь к этим идентификаторам с некоторым уважением. Выберите, какой будет уникальным. Это кандидаты в ключи. Вам нужно по крайней мере один на стол, и будет более одного
Product
, Все идентификаторы, по которым будет производиться поиск, должны быть проиндексированы (уникальные или нет). Обратите внимание, что уникальные индексы не могут иметь значение Nullable, поэтому вы не можете выбрать дополнительный столбец.Что делает единый уникальный идентификатор для
Product
не может быть одного столбца. Это нормально, мы можем оценить несколько столбцов для ключей в базах данных; они называются составными ключами.Возьмите лучший, самый стабильный (тот, который не изменится) уникальный идентификатор, один из ключей-кандидатов, и сделайте его первичным ключом.
Если и только если уникальный идентификатор, первичный ключ, который может быть составным ключом, очень длинный и поэтому не подходит для первичного ключа, который переносится в дочерние таблицы, тогда добавьте суррогатный ключ. Это будет
Id
колонка. Обратите внимание, что это дополнительный столбец и дополнительный индекс. Он не заменяет идентификаторыProduct
Ключи-Кандидаты; они не могут быть удалены.
До сих пор у нас есть база данных о продуктах на веб-сайте вашей компании, которая имеет для нее смысл. Теперь мы можем оценить продукты с другой стороны сети; и когда мы делаем, у нас есть сильная основа, с которой мы можем измерить мусор, который мы получаем с другой стороны сети.
Ленты
Тебе необходимо
WebSite
таблица для управления каналами.Будет ассоциативная таблица (многие ко многим) между
Product
а такжеWebSite
, Давайте назовем этоProductSite
, Он будет содержать только нашиProductId
иWebSiteCode. It may contain
Price`. Содержимое действительно для одного цикла подачи.Загрузите каждый канал в промежуточную базу данных или схему, входящую
ProductIn
таблица, может быть одна на исходный сайт. Это просто плоский файл из внешнего источника. Добавить столбецIsValid
и установите значение по умолчанию в true.Затем напишите некоторый SQL, который сравнивает
ProductIn
стол, с его свободным и гибким содержимым, с нашимиProduct
таблица с ее сильными идентификаторами.Я бы сделал это несколькими волнами отдельных проверок, каждая из которых помечает строки, которые потерпели неудачу, с
IsValid
ложно. В конце вставьтеIsValid
строки в нашProductSite
,Возможно, вам повезет, и уйдет с оптимистичным подходом. То есть, если вы найдете совпадение в нескольких важных столбцах, совпадение действительно. (отменить настройки по умолчанию и обновить
IsValid
булево).Это - процесс, который потребует некоторой работы вперед-назад, пока это не успокоится. Вот почему вам нужно работать с вашими пользователями по идентификаторам. Цель состоит в том, чтобы не исключать никаких внешних продуктов, но ваша отправная точка исключит многие. Это будет включать возвращение к нашему
Product
таблица и улучшение содержимого (значения в строках) идентификаторов и других соответствующих столбцов, которые вы используете для идентификации совпадающих строк.
Повторите для каждого веб-сайта.
Теперь заполните наш сайт с нашего
Product
таблицу, используя информацию, в которой мы уверены, и показать, какие сайты имеют продукт для продажи изProductSite
,
Я не думаю, что это проблема кода или базы данных (пока). Ты говоришь:
Проблема в том, что у элемента нет очевидного уникального идентификатора.
Вам нужно выяснить, в чем заключается эта уникальность, прежде чем вы сможете попросить компьютер сделать это для вас. Похоже, вам нужен какой-то нечеткий алгоритм схожести строк.
Некоторые примеры данных, которые вы считаете дубликатами, могут помочь.