0

Планирует схему базы данных для хранения атрибутов продукта Amazon и дополнительных ценности торговой площадки конкретной (например, название, исполнитель, вес и т.д.)Реализации составного индекса для таблицы с редкими обновлениями/вставляет

До сих пор является Товары стол с GTIN varchar(13) (PK) столбец. В моем конкретном случае GTIN может быть идентификатором EAN/UPC/ISBN. В продуктах также есть столбец ASIN char(10), чтобы связать GTIN с ASIN.

Поведение, когда и EAN и UPC существуют для одного и того же ASIN, программно пойманы и правильно обработаны, поэтому учитывайте все уникальные ASIN. Я определил UNIQUE NONCLUSTERED CONSTRAINT на ASIN и связал его с таблицей продуктов как один-ко-многим.

Второй стол ProductsData определяет ASIN char(10) (FK) и mid tinyint (идентификатор биржи). Все ASINs сохраняются вместе с соответствующими идентификаторами Рынок:

rowid ASIN   mid 
1  B0002DB5GS 1 
2  B0002DB5GS 44 
3  B0002DB5GS 39 
4  B0002Y4SYS 1 
5  B0002Y4SYS 44 
6  B0002Y4SYS 39 

Как вы заметили, есть также rowid int IDENTITY(1,1) колонна, которая является фиктивной, но реализует уникальность.

Assumning в follwing факты:

  • очень редкие обновления
  • относительно редкие вставки (каждый добавленный продукт создает 3 записи в транзакции)
  • время не делеции
  • интенсивные выбирает на колонке ASIN
  • rowid - это манекен, который просто обеспечивает уникальность.

Сюда приходят три вопроса:

  1. ли стоит, чтобы сделать композитный индекс на ASIN и mid?
  2. Если да, то кластерный или некластеризованный?
  3. Могу ли я избавиться от кластерного индекса по адресу rowid, потому что он мне не нужен?

ответ

1

Из того, что вы уже говорилось выше, если производительность была проблема, и я чувствовал, что индексирование было решение, которое я бы реализовать некластерный индекс покрытия на ASIN и mid. Что-то вроде этого:

CREATE NONCLUSTERED INDEX IX_ASIN_COVERING_mid ON ProductsData (ASIN) INCLUDE (mid) 

Таким образом, когда вы присоединитесь к ProductsData таблице, вы можете использовать индекс для производительности и потому, что в середине будет «включено», он будет сохранен с индексом и двигателем запроса не будет нужно идти глубже.

Есть, конечно, много путей вперед, но на основе вашего поста это то, к чему я склоняюсь. Надеюсь, поможет!

Так вроде подытожить ваши вопросы

  1. Мое мнение заключается в использовании индекс покрытия, а не составной индекс. Это потому, что похоже, что ваша связь между Products и ProductsData - это ASIN, а середина - только для езды. Поэтому нет необходимости составлять его с ASIN в индексе ... в том числе он отлично работает здесь - вроде того, на что он предназначен, на мой взгляд.

  2. Некластеризованный, как указано в 1, поскольку кластерные индексы должны быть уникальными. Кроме того, кластеризованные индексы поддерживают упорядочение данных, поэтому, если вы создаете новый продукт, и его ASIN подходит где-то посередине таблицы, здесь возникают накладные расходы, потому что SQL Server необходимо будет переупорядочить всю таблицу

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

+0

Идея индекса покрытия выглядит очень хорошо для меня. Спасибо. Как насчет колонки 'rowid'? Нужно ли мне это сделать эту схему? Могу ли я избавиться от индекса кластеризации ПК, который на самом деле никогда не используется? –

+0

См. Обновленный ответ ... Я думаю, что вы можете полностью избавиться от этого столбца, так как он выглядит так, как ваша таблица ProductsData - это таблица поиска/отображения для ASIN и mid –

+0

Благодарим вас за такой подробный ответ. Очень признателен! –