Нормализация таблицы с низкой целостностью

Это может произойти, если в вашем AndroidManifest.xml дважды объявлена ​​ваша MainActivity.

Еще одна возможная причина: вы изменили активность запуска. Подсказка: никогда не делайте этого с уже опубликованными приложениями! Причины, обсуждаемые в блоге разработчиков Android .

6
задан Matt 25 November 2014 в 13:26
поделиться

5 ответов

Обновите вопрос, у Вас есть список CompanyNames доступным Вам? Я спрашиваю потому что Вы, возможно, способный использовать алгоритм Levenshtein для нахождения отношений между списком CompanyNames и LocationNames.


Обновление

Нет списка Названий компаний, я должен буду генерировать название компании с Названия самого описательного или лучшего расположения, которое представляет несколько местоположений.

Хорошо... попробуйте это:

  1. Создайте список кандидата CompanyNames путем нахождения LocationNames составленным из главным образом или все буквенные символы. Можно использовать регулярные выражения для этого. Сохраните этот список в отдельной таблице.
  2. Вид, которые перечисляют в алфавитном порядке и (вручную) определяют, какими записями должен быть CompanyNames.
  3. Сравните каждый CompanyName с каждым LocationName и придумайте счет соответствия (используйте Levenshtein или некоторый другой алгоритм сопоставления строк). Сохраните результат в отдельной таблице.
  4. Установите пороговый счет, таким образом, что любой MatchScore <Порог не будут считать достойным данного CompanyName.
  5. Вручную ветеринар через LocationNames CompanyName | LocationName | MatchScore, и выясняют, которые на самом деле соответствуют. Упорядочивание MatchScore должно сделать процесс менее болезненным.

Целая цель вышеупомянутых действий состоит в том, чтобы автоматизировать части и ограничить объем Вашей проблемы. Это совсем не прекрасно, но надо надеяться избавит Вас от необходимости пройти записи 18K вручную.

1
ответ дан 17 December 2019 в 20:36
поделиться

Я должен был сделать это прежде. Единственный реальный способ сделать это состоит в том, чтобы вручную подойти различные местоположения. Используйте консольный интерфейс своей базы данных и группирующий избранные операторы. Во-первых, добавьте свое поле "Company Name". Затем:

SELECT count(*) AS repcount, "Location Name" FROM mytable
 WHERE "Company Name" IS NULL
 GROUP BY "Location Name"
 ORDER BY repcount DESC
 LIMIT 5;

Фигура, какая компания местоположение наверху списка принадлежит и затем обновляет Ваше поле названия компании с ОБНОВЛЕНИЕМ... ГДЕ "Название Местоположения" = оператор "The Location".

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

Обновление: - ничего себе - никакие дубликаты? Сколько записей Вы имеете?

1
ответ дан 17 December 2019 в 20:36
поделиться

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

Я рекомендовал бы, чтобы Вы отправили задание Amazon Mechanical Turk и позволили человеку уладить его.

0
ответ дан 17 December 2019 в 20:36
поделиться

Идеально, Вы, вероятно, хотели бы отдельную таблицу под названием Компания и затем company_id столбец в этой таблице "Location", которая является внешним ключом к первичному ключу таблицы Company, вероятно, названному идентификатором. Это избежало бы небольшого количества текстового дублирования в этой таблице (более чем 18 000 строк, целочисленный внешний ключ оставит довольно мало свободного места по varchar столбцу).

Но Вы все еще сталкиваетесь с методом для загрузки той таблицы Company и затем правильно соединения его со строками в Месте. Нет никакого общего решения, но Вы могли сделать что-то вдоль этих строк:

  1. Составьте таблицу Company с идентификационным столбцом, что автоинкременты (зависит от Вашего RDBMS).
  2. Найдите все уникальные названия компаний и вставьте их в Компанию.
  3. Добавьте столбец, company_id, к Местоположению, которое принимает, АННУЛИРУЕТ (на данный момент), и это - внешний ключ столбца Company.id.
  4. Для каждой строки в Месте определите соответствующую компанию и ОБНОВИТЕ company_id столбец той строки с идентификатором той компании. Это вероятно самый сложный шаг. Если Ваши данные похожи на то, что Вы показываете в примере, необходимо будет, вероятно, взять много выполнений в этом с различными подходами сопоставления строк.
  5. После того как все строки в Месте имеют значение company_id, затем можно ИЗМЕНИТЬ таблицу Company для добавления ограничения NOT NULL к company_id столбцу (предполагающий, что каждое местоположение должно иметь компанию, которая кажется разумной).

Если можно сделать копию таблицы Location, можно постепенно создавать серию SQL-операторов для заполнения company_id внешнего ключа. Если Вы делаете ошибку, можно только запустить и повторно выполнить сценарий на грани отказа.

0
ответ дан 17 December 2019 в 20:36
поделиться

Да, тот шаг 4 от моего предыдущего сообщения является doozy.

Независимо от того, что, Вы, вероятно, оказываетесь перед необходимостью делать часть этого вручную, но Вы можете автоматизировать объем его. Для местоположений в качестве примера Вы дали, запрос как следующее установит соответствующее company_id значение:

UPDATE  Location
SET     Company_ID = 1
WHERE   (LOWER(Location_Name) LIKE '%to_n shop%'
OR      LOWER(Location_Name) LIKE '%tts%')
AND     Company_ID IS NULL;

Я полагаю, что это соответствовало бы Вашим примерам (я добавил IS NULL часть для не перезаписи ранее набора значения Company_ID) но конечно в 18 000 строк Вы оказываетесь перед необходимостью быть довольно изобретательными для обработки различных комбинаций.

Что-то еще, что могло бы помочь, должно будет использовать имена в Компании для генерации запросов как тот выше. Вы могли сделать что-то как следующее (в MySQL):

SELECT  CONCAT('UPDATE Location SET Company_ID = ',
        Company_ID, ' WHERE LOWER(Location_Name) LIKE ',
        LOWER(REPLACE(Company_Name), ' ', '%'), ' AND Company_ID IS NULL;')
FROM    Company;

Затем просто выполните операторы, которые это производит. Это могло сделать большую гранжевую работу для Вас.

0
ответ дан 17 December 2019 в 20:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: