2012-06-08 4 views
2

Существует таблица продуктов. Это порядок по столбцу: OrderIdЖесткий заказ по дизайну колонны

Когда я вставляю строку в таблицу. Теперь возникает проблема.

например:

product_name orderid 
A    1 
X    2 
U    3 

Я пытаюсь вставить продукт D и заказ между А и X Таким образом, я должен поставить двойки OrderID = 2, а затем обновить X & OrderID ˙U в + 1

product_name orderid 
A    1 
D    2 
X    3 
U    4 

Проблема в том, что действия вставки часто и число записей будет очень большим. Таким образом, производительность - большая проблема.

В этом случае есть ли лучший дизайн?


сейчас я попробую решение Джеффри и спасибо за советы по назначению sam yi.

product_name  order_num 
A    100 
D    101 
X    200 
U    300 

Когда пробел будет заполнен, я сделаю все последующие записи добавленными.

product_name order_num 
A    100 
Z1    101 
Z2    102 
...    ... 
Z200   200 
X    300(200+100) 
U    400(300+100) 
+0

Зачем вам нужен столбец «OrderId»? –

+0

Прошу прощения, я не могу показать вам дизайн продукта. Но я могу использовать подобный сценарий для exmaple. Если у вас есть книга. вы вставляете запись страницы рядом со страницей 1, поэтому вы должны заказать номер страницы. Если вы ее не закажете, это будет странно. – piforever

ответ

0

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

Набор OrderId со значениями с широкими зазорами между ними, так что большую часть времени вам не нужно будет обновить другие строки, например:

product_name orderid 
A   10 
X   20 
U   30 

Так продукт D может быть вставлен с OrderID = 15.

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

+0

благодарит Джеффри. Но я подумал об этом решении. Записи огромны. Так может быть, что промежутки часто заполняются. И я пытаюсь установить разрыв = 1000, но он все еще, вероятно, заполнен. И когда я попытаюсь вставить запись рядом с B (14), сначала подсчитаю предыдущий номер, а затем получу номер 15. Я думаю, что это принесет новые затраты. – piforever

+0

Какой бы промежуток вы ни выбрали, вы собираетесь его заполнить. Дело в том, что если у вас есть пробелы, вам больше не нужно * обновлять каждую строку * ** каждый раз **, который вы вставляете в таблицу. Вы можете рассчитывать на «полное обновление» только периодически. Например, вы можете создать ночное пакетное задание для повторной обработки данных, чтобы снова заполнить пробелы «большой». –

+0

Кроме того, идея состоит в том, что если предыдущая запись (14), не просто установите вставленную запись в (15). Найдите следующую запись и разделите разницу - например, если запись до/после равна (14) и (20), установите вставленную запись в (20 + 14)/2 = (17) –

3

я вообще не нравится этот подход, но ...

Вы, возможно, придется сделать обновление до или после вставки.

update <table> 
set orderid = orderid + 1 
where orderid >= x 

Возможно, добавьте это в курок.

Кроме того, «OrderId» может быть очень вводящим в заблуждение (Invoice/Order Id) ... Обычно я пытаюсь ограничить слово «Id» для истинных столбцов id.

+0

+1 для подхода, а также примечание о запутанном имени столбца. Однако я бы не рекомендовал это делать в триггете таблицы базы данных. –

+0

Согласен. Вы можете использовать его как ПОСЛЕ, но это ужасно, так как он будет выполнять сканирование таблицы каждый раз, даже если никакие идентификаторы не увеличивались. – matchdav

0

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

Как это:

SELECT order_id=count(*), t1.product_name 
FROM your_table t1, your_table t2 
WHERE t1.product_name >= t2.product_name 
GROUP BY t1.product_name 
ORDER BY order_id 

Вы можете заменить любое условие, которое вы хотите в предложении WHERE, на мой взгляд, вы должны быть приказывая ваши заказы по дате или каким-либо другим разумным параметром. Но приращение каждой строки в столбце каждый раз, когда вы вставляете что-то, является очень плохим шаблоном дизайна.