#c# #mysql #sentence
#c# #mysql #предложение
Вопрос:
У меня вопрос о том, как оптимизировать мою базу данных :
У меня есть первая таблица, в которой я задаю список элементов (табличек) со всеми его геометрическими определениями, который выглядит так :
CONTRACT | NAME | CONTOURS | HOLES | SCRIBING
C1 | D001 | bigString|bigString|bigString
C1 | D003 | bigString|bigString|bigString
C2 | D003 | bigString|bigString|bigString
...
Затем во второй таблице у меня есть список блоков (на самом деле это большие таблицы, в которые входят таблицы 1-й таблицы, я называю это box, чтобы не вносить путаницу), в каждом поле у меня есть список элементов внутри, и я определяю его следующим образом.
ID | NAME | NAME_ELEMENT | CONTRACT_ELEMENT| QUANTITY |
10001 | BOX1 | D001 | C1| 100 |
10001 | BOX1 | D003 | C1| 100 |
10001 | BOX1 | D003 | C2| 100 |
...
Я не ссылаюсь на идентификатор, но на КОНТРАКТ и ИМЯ, это добровольно (первая таблица — это только таблица с геометрическими определениями).
Проблема в том, что у меня есть ListView со списком полей, и когда я нажимаю на одно поле, мне нужно отобразить все элементы внутри поля. На данный момент я просто делаю что-то подобное :
foreach(Plate plate in contexte.SelectedBox)
{
plate.GetGeometry();
}
Редактировать: Забыл сказать, моя функция GetGeometry — это просто SQL-запрос «SELECT * FROM DEFINITION_TABLE ГДЕ CONTRACT=’C1′ И NAME =’D001′.
Это работает хорошо, но когда у меня есть большая таблица с сотнями элементов внутри, она очень длинная, так как она выполняет сотни запросов SELECT.
Я вижу 2 способа решения проблемы :
-
В моей таблице определения поля добавьте геометрическую информацию о деталях. Но правильно ли это, поскольку это означает копирование всех определений в обеих таблицах.
-
Сделайте SQL-запрос типа
SELECT *
FROM TABLE_DEFINITION
WHERE (CONTRACT='C1' OR CONTRACT='C2') AND (NAME='D001' OR NAME='D003'...)
- Запрос может быть
SELECT *
FROM TABLE_DEFINITION
WHERE (CONTRACT='C1' AND NAME='D001') OR (CONTRACT='C1' AND NAME='D003') OR (CONTRACT='C2' AND NAME='D003')...
Но в случае, если у меня есть сотни деталей, предложение будет очень длинным.
Я чувствую, что 1-й вариант не является хорошим и может использовать 2-й. Что бы вы посоветовали по этому поводу? Нормально ли составлять такое длинное предложение для MySQL? Я ограничен по длине предложения?
Редактировать: Спасибо @Akina за редактирование сообщения, не могли бы вы объяснить, как вы добавили пробелы в таблицу? Я добавил пробелы, но стек автоматически удалил их все?
Комментарии:
1. Я чувствую, что 1-й вариант не является хорошим и может использовать 2-й. Ваши запросы НЕ эквивалентны. У вас нет «опций» — у вас есть по крайней мере один (и даже, возможно, оба) нелогичных запроса.
2. @Akina сначала спасибо за редактирование (не смог сам добавить пробелы), затем я понимаю, что 3-й запрос не является полностью «правильным», и ему потребуется второй фильтр на уровне кода. Так что 2-й был бы хорошим. Но нормально ли делать такой длинный запрос для MySQL? Я имею в виду, если у меня есть 200 элементов, например.
3. Используйте форму
WHERE (CONTRACT, NAME) IN (('C1','D001'), ('C1','D003'), ('C2','D003'), ...)
— она занимает меньше байтов. можно ли делать такой длинный запрос для MySQL? Ищитеmax_allowed_packet
значение — размер текста вашего запроса не должен превышать его (по умолчанию он равен 64 Мбайт). Помните — если ваш список литералов превышает ~ 10 элементов, MySQL отсортирует его перед использованием в запросе.4. Спасибо, не знал этого синтаксиса … Не могли бы вы написать это как ответ, чтобы я мог закрыть вопрос, пожалуйста?
5. Не убежден представленной вами моделью данных. В этих таблицах нет / нет общих столбцов, которые позволили бы успешно выполнить операцию объединения.
Ответ №1:
Используйте форму
WHERE (CONTRACT, NAME) IN (('C1','D001'), ('C1','D003'), ('C2','D003'), ...)
это занимает меньше байтов.
можно ли делать такой длинный запрос для MySQL?
Ищите max_allowed_packet
значение — размер текста вашего запроса не должен превышать его (по умолчанию он равен 64 Мбайт).
Помните — если ваш список литералов превышает ~ 10 элементов, MySQL отсортирует его перед использованием в запросе.