Это упрощенная версия проблемы.Нормализация общего типа идентификатора, разделяемого между таблицами
У нас есть клиенты, которые присылают нам много данных, а затем запрашивают его. Мы обязаны им иметь несколько «открытых» идентификаторов, которые они могут запросить у наших данных. (Большинство из них хотят запросить нашу систему по идентификатору, который они отправляют вместе с данными, но не всегда). Для простоты мы будем называть их «pid», «crid» и «musicbrainzid». У нас есть таблица «entity», которая хранит эту информацию. Это выглядит примерно так («авторитет», кто послал данные):
entity
--
entity_id
authority // who sent the data
type // 'pid', 'crid', 'musicbrainz', etc.
value // the actual id value
Тогда у нас есть отдельные объекты, такие как «серия» «эпизод» и «вещание» (на самом деле, есть намного больше, но я держу его здесь просто). Каждый из них имеет entity_id, указывающий на таблицу сущности.
Как внешние клиенты могут искать через pid или crid и получать соответствующий эпизод или серию, а также правильное определение того, что это такое? Учитывая pid, мы можем получить идентификатор объекта, но тогда нам нужно искать серию эпизодов, серию и широковещательные таблицы для этого значения. Кроме того, не все идентификаторы обязательно будут связаны со всеми другими таблицами, но любой объект (например, «эпизод») может иметь несколько идентификаторов (ИДП, CRID и т.д.)
Стратегии:
- Найдите идентификатор объекта для pid и найдите все остальные таблицы для pid.
- Поместите столбец «entity_type» на сущности, но что, если это pid в таблице эпизодов, но мы случайно установили серийный номер episode.type? Мы не хотим дублировать данные, и я не хочу помещать метаданные базы данных в значения столбцов.
Вариант № 1 является медленным и кажется неправильным (далее, различные таблицы имеют различные структуры, создающие проблематичные).
Вариант 2 означает дубликаты данных, и эти данные могут выйти из строя. Мы можем использовать триггеры для этого, но это кажется очень неприятным, и в любом случае ошибки в реализации триггеров mysql поразили нас несколько раз. Мы используем эту стратегию прямо сейчас, но без триггеров.
Что такое вариант 3?
Сторона примечания: мы знаем, что нам нужно разбить «авторитет» на отдельную таблицу, потому что не все полномочия/комбинации типов действительны.