Составной индекс SQL для нескольких таблиц - PullRequest
0 голосов
/ 03 декабря 2018

Я хотел бы получить небольшое разъяснение по настройке составного индекса для таблиц SQL.Может кто-нибудь, пожалуйста, сообщите мне, если это возможно, по крайней мере, с базой данных h2?

Пример: у меня есть 2 таблицы, категории и клиент.Каждая категория имеет много клиентов.Таким образом, требование состоит в том, чтобы разрешить одному покупателю покупать только товар в каждой категории [или, другими словами, customer_id должен быть уникальным для каждой категории].Однако существует миллионы записей, поэтому следующий запрос (для проверки уникальности) не слишком эффективен.

SELECT COUNT(*) 
FROM CATEGORIES c 
INNER JOIN CUSTOMER ct 
on c.CUSTOMER_ID=ct.id 
WHERE c.id = '1' AND ct.EMAIL='joe@xzy.com'

Для обработки требуется несколько секунд.Итак, вопрос в том, возможно ли создать индекс для обеих этих таблиц, как показано ниже?

CREATE INDEX "TEST" ON "CATEGORY" ("CUSTOMER_ID") and "CUSTOMER" ON CUSTOMER("EMAIL)

категории

| id | categoryname    | CUSTOMER_ID |
+----+---------+---------+--------------
|  1 |  electronics      |      1      |
|  2 |  food             |      2      |

customer

| id | name  | city     | EMAIL
+----+------------------+-------
|  1 |  Joe  | Newyork   |  joe@xyz.com
|  2 |  Ross | Washington| ross@xzy.com
| .. |  .... | ..... |

1 Ответ

0 голосов
/ 03 декабря 2018

Вам не нужна такая вещь, как «составной индекс по таблицам».Вам просто нужен индекс для категорий. CUSTOMER_ID, который ускорит все поиски определенного CUSTOMER_ID в вашей таблице категорий.

Тем не менее, у вашего дизайна есть серьезные проблемы.Ваша таблица «категорий» служит двум различным целям: одна, чтобы сказать что-то о категориях как таковых, две, чтобы сказать, какие клиенты в каких категориях участвуют.если вы попытаетесь взглянуть на это сквозь призму теории нормализации или попытаетесь идентифицировать все «разумные» ключи для ваших таблиц, вы неизбежно обнаружите, что таблица категорий в ее нынешнем виде должна быть разбита наCategories (id, name) и category_customers_part (category_id, customer_id).

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

...