Как мне правильно структурировать таблицу «продукты» с более чем 250 000 строк?

#mysql #database-design

#mysql #база данных-дизайн

Вопрос:

Проблема

Я получил небольшой контракт на разработку онлайн-системы котировок для электронного дистрибьютора. У него примерно полмиллиона деталей — один маленький винт считается деталью, один маленький светодиод и т.д. Итак, есть МНОГО частей.

Одно важное замечание: это всего лишь запрос предложения. Нет никаких цен на стороне клиента, или итогов, или чего-либо, что связано с деньгами. Просто собираю список номеров деталей для отправки моему клиенту.

Мне пришлось собирать данные о деталях из нескольких источников (веб-сайт поставщика, каталог отсканированных документов, электронные таблицы Excel, файлы CSV и даже несколько файлов JSON. Это было утомительно, но я справился.

Результаты

Сначала сбивает с толку. У меня были десятки категорий продуктов, и у некоторых продуктов было так много атрибутов, которые не были общими ни для каких других продуктов. Я мог видеть, что этот проект становится очень сложным, и, учитывая тот факт, что я предложил за эту работу даже 900 долларов, я должен был как-то упростить это.

Это то, что я придумал, и получил одобрение клиента.

Текущие столбцы

  -------------------------- -------------- ------ ----- --------- ------- 
| Field                    | Type         | Null | Key | Default | Extra |
 -------------------------- -------------- ------ ----- --------- ------- 
| Datasheets               | varchar(128) | YES  |     | NULL    |       |
| Image                    | varchar(85)  | YES  |     | NULL    |       |
| DigiKey_Part_Number      | varchar(46)  | YES  |     | NULL    |       |
| Manufacturer_Part_Number | varchar(47)  | YES  |     | NULL    |       |
| Manufacturer             | varchar(49)  | YES  |     | NULL    |       |
| Description              | varchar(34)  | YES  |     | NULL    |       |
| Quantity_Available       | int(11)      | YES  |     | NULL    |       |
| Minimum_Quantity         | int(11)      | YES  |     | NULL    |       |
 -------------------------- -------------- ------ ----- --------- ------- 
  

таким образом, все продукты будут соответствовать этому шаблону страницы (меню внизу — ошибка на скриншоте).:

Вид продукта

Автозаполнение Со стола?

На ранних стадиях разработки я реализовал приятную функцию автозаполнения:

Автозаполнение

НО … учитывая количество продуктов в таблице, практично ли это вообще сейчас???

КОЛИЧЕСТВО КОНЕЧНОГО ПРОДУКТА: 223 347

Какие изменения мне нужно внести в таблицу ПРОДУКТОВ, чтобы запрос к таблице не занимал вечность?

Это единственные запросы, которые будет выполнять приложение (не уверен, поможет ли эта информация в вашем совете по решению)…

  1. Получить все товары по категориям: Выберите * из товаров, где категория = ‘полупроводники’

  2. Получить отдельный продукт: Выберите * из продуктов, где Manufacturer_Part_Number = ‘12345’

  3. Получить количество товаров по категориям

Я думаю, что эти три действительно охватывают все, что мне нужно сделать. Может быть, еще пара, но не так много.

В заключение…

Есть ли способ «проиндексировать» эту таблицу с 223000 записями, где поиск по одному или нескольким столбцам может быть выполнен эффективно?

Я новичок в проектировании баз данных и знаю, что мне нужно ЧТО-ТО индексировать, но … ЧТО???

Спасибо, что нашли время, чтобы просмотреть этот пост.

С уважением,

Джон

Комментарии:

1. Найдите время, чтобы прочитать об индексации (разделы 1 и 2). 3) периодически генерируйте этот результат, поскольку это длинный запрос, который нельзя оптимизировать..

2. Каков ваш ПЕРВИЧНЫЙ КЛЮЧ?

3. Я согласен, что у вас должен быть первичный ключ (т. Е. Номер продукта). Для этого, вероятно, нельзя использовать Manufacturer_Part_Number, потому что два разных производителя могут использовать один и тот же номер для одного из своих продуктов. Кажется, что Manufacturer_Part_Number уникален только в сочетании с Manufacturer . (Вы должны указать уникальное ограничение для двух столбцов.) Это делает маловероятным, что вы захотите найти продукт только по Manufacturer_Part_Number, вам также придется ограничить по производителю или выполнить поиск по уникальному номеру продукта.

Ответ №1:

Перечисление запросов является обязательным для ответа на ваш вопрос. Спасибо, что включили их.

 INDEX(category)
INDEX(Manufacturer_Part_Number)
  

Но я полагаю, что ваш второй запрос также должен включать Manufacturer . Тогда это было бы лучше:

 INDEX(Manufacturer, Manufacturer_Part_Number)
  

Все NULL ? Кажется маловероятным.

(Я выполнял задания, подобные вашему; я не могу представить, что предложу всего 900 долларов за всю эту очистку.)

Что вы будете делать, когда в одной категории или производителе будет тысяча товаров? Пользовательский интерфейс со списком из тысячи элементов отстой.

Для того, как обрабатывать «так много атрибутов», я рекомендую http://mysql.rjweb.org/doc.php/eav (Я должен взять с вас 899 долларов за исследование, которое вошло в этот документ. Просто шучу.)

Разве им не нужны другие поисковые запросы, такие как «Флэш-накопитель», которые должны соответствовать «FLASH DRV»?

223 Тыс. строк — без проблем. VARCHARs Кажутся слишком короткими; были ли они основаны на данных?

И для таблицы требуется PRIMARY KEY .

Комментарии:

1. Я действительно ценю ответ. Я внес предложенные вами изменения. Были изменены размеры столбцов, а также добавлен новый индекс. Я добавил первичный ключ к номеру детали производителя, поскольку они никогда не должны дублироваться. У меня есть полнотекстовый индекс в описании, чтобы помочь с автозаполнением. Иногда возникает задержка, но в целом все работает нормально. Я также запустил базу данных с помощью утилиты нормализации. Что касается дешевой цены, я согласен, это была отдача. Это для одного из членов церкви, так что я был не против. Я думаю, что многому научился — хотя с индексами трудно увидеть результаты.