Лучший способ обрабатывать повторяющиеся строки - PullRequest
1 голос
/ 25 мая 2020

У меня в базе данных есть «словарь» страховых компаний, скажем:

+----+-------------------+----------+
| ID | Name              | Data     |
+----+-------------------+----------+
| 1  | InsuranceCompany1 | SomeData |
+----+-------------------+----------+

Но я получаю данные из другой системы, и в результате у меня есть дубликаты страховых компаний, но без моих данных :

+----+-------------------+----------+
| ID | Name              | Data     |
+----+-------------------+----------+
| 1  | InsuranceCompany1 | SomeData |
+----+-------------------+----------+
| 2  | InsuranceCompany1 |          |
+----+-------------------+----------+

Обе записи связаны в различных моделях, но они относятся к одним и тем же данным, и я хочу объединить эти записи в пары без изменения запросов или данных в других таблицах, чтобы никто не знал, что есть две записей, но оба относятся к одному экземпляру

 +----+-------------------+----------+
 | 1  | InsuranceCompany1 | SomeData |
 +----+-------------------+----------+

Мой вопрос: есть ли какой-нибудь правильный способ справиться с подобными ситуациями? Я придумал решение, которое состоит в том, чтобы добавить столбец parent_id и вручную установить parent_id в повторяющихся строках, а затем переопределить методы Eloquent, такие как find в модели, чтобы вернуть родительский элемент, если установлен parent_id.

Копирование столбца SomeData не является вариантом, потому что может быть условие, если insurance_company_id == id;

1 Ответ

1 голос
/ 25 мая 2020

Вы можете попробовать создать представление своей dict таблицы примерно так:

  CREATE VIEW unique_dict AS
  SELECT MIN(ID) ID,
         Name,
         GROUP_CONCAT(Data) Data
    FROM dict
   GROUP BY Name

Это даст вам одну строку для каждого имени.

Затем, в ваших запросах, требующих одной строки на имя, выберите SELECT из представления unique_dict, а не из таблицы dict.

GROUP_CONCAT() возвращает список значений из Data , что помогает, если более чем одна повторяющаяся строка содержит значение: вы получаете их все.

В более долгосрочной перспективе вам может быть разумно рассматривать эти дубликаты как «грязные данные» и очищать их по мере ВСТАВЛЕНИЯ новых строк . Как это сделать?

Создать уникальный индекс на Name.

CREATE UNIQUE INDEX unique_name ON dict(Name);

Затем при загрузке новых данных в dict используйте функцию updateOrCreate() Eloquent. Вот что можно прочитать об этом. Laravel 5.1 Создание или обновление дубликата

...