У меня есть следующая таблица ссылок один к одному
CREATE TABLE `foo_bar` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
`foo_id` int(10) unsigned NOT NULL,
`bar_id` int(10) unsigned NOT NULL,
…
PRIMARY KEY (`id`),
…
) ENGINE=InnoDB
Где foo_id
и bar_id
- внешние ключи к таблицам foo
и bar
соответственно
Естьтакже
- Уникальный индекс на
(foo_id, bar_id)
, который используется для сопоставления внешнего ключа foo_id
для записей foo и производительности запросов, и… - Уникальный индекс на
bar_id
, который используется для сопоставления внешнего ключа с bar_id
на записи баров
Примечание , что эта настройка допускает неуникальные foo_id
sдо тех пор, пока они сопровождаются уникальным bar_id
Теперь я хотел бы обеспечить уникальность только для foo_id
, сохраняя при этом преимущества производительности существующего составного индекса для (foo_id, bar_id)
Есть ли способ создания уникального составного индекса, в котором уникальность применяется для подмножества столбцов, на которые есть ссылки, но позволяет добавлять дополнительные столбцы в индекс?
В этом примере это будет выглядеть как ([foo_id], bar_id)
где tКвадратные скобки указывают уникальную часть составного индекса
Я хотел бы избежать накладных расходов на отдельный индекс на (foo_id, bar_id)
Вне моей головы, я не могу думатьлюбой алгоритмической причины, почему это было бы невозможно - пока уникальное подмножество столбцов находится в начале составного индекса
Примечание , которое я знаю, что я мог бы использоватьлибо foo_id
, либо bar_id
в качестве первичного ключа для таблицы, но приложению требуется отдельный идентификатор, с помощью которого можно отдельно удалить ссылку, не раскрывая ссылки.
В основном foo_bar.id
хранится вфайл cookie клиента (после обратимого шифрования), и любые личные данные доступны с этого идентификатора.Идея состоит в том, что, если клиент запрашивает удаление, мы удаляем запись foo_bar
и удаляем их данные, не уничтожая анонимные или функциональные данные в foo
и bar
Это имеет дополнительный бонус, который дажеесли файл cookie сохраняется где-либо, он больше не будет разрешен до любых данных