Форум сайта python.su
o7412369815963А причем тут уровень? Я говорю не о каком то дереве, а что принцип нужно менять на double linked list. Ты просто тогда будешь иметь цепь в которую при вставке елемента ненужно будет менять половину списка. А то что запрос чуть сложнее “select from table order by col”, это нонсенс.
в данном методе вставить элементы можно только к элементам верхнего уровня, к вставленным объектам не вставить… типа того, имхо, да и выборка не простой селект.
Отредактировано (Июнь 3, 2010 23:09:35)
Офлайн
Вот еще пример обо чем я:
id name parent_id
aaa John null
bbb Mike aaa
ccc Tom bbb
Для того чтобы вставить Peter после Mike, нужно:
1) вставить новую запись: ddd Peter bbb
2) поменять parent_id у Tom на ddd
Тогда будешь иметь таблицу:
id name parent_id
aaa John null
bbb Mike aaa
ccc Tom ddd
ddd Peter bbb
а после запроса получишь в порядке:
John, Mike, Peter, Tom
Офлайн
o7412369815963
база - MongoDB (sql привел для объяснения), сейчас в данной коллекции около 5000 документов, алгоритм хочу с расчетом на будущее (до 1млн), да и вообще полезно знать подобные алгоритмы
размер базы, думаю, в данном случае не важен, буть то он 1Мб или 1Гб. вставка идет одной/двумя командами - алгоритм не измениться. конечно может от размера БД хост будет плющить, тут уже распараллеливать , кластеризовать и т.д, но это уже совсем другая задача…
o7412369815963:D
обычная sql: mysql, mssql, пострадж и подобные.
Офлайн
nerijusя не про сложность, а про тяжесть. там джойн ( нужно получить 2 таблицы, состыковать их, потом отсортировать ), он гораздо тяжелее одного селекта
А то что запрос чуть сложнее “select from table order by col”, это нонсенс.
nerijusвот тут поподробней, попробую с имитировать ситуациюo7412369815963А причем тут уровень? Я говорю не о каком то дереве, а что принцип нужно менять на double linked list. Ты просто тогда будешь иметь цепь в которую при вставке елемента ненужно будет менять половину списка.
в данном методе вставить элементы можно только к элементам верхнего уровня, к вставленным объектам не вставить… типа того, имхо, да и выборка не простой селект.
Офлайн
nerijusSELECT parentList.Id, parentList.name, parentList.ParentId, childList.Id AS ChildId
aaa John null
bbb Mike aaa
ccc Tom ddd
ddd Peter bbb
а после запроса получишь в порядке:
John, Mike, Peter, Tom
Отредактировано (Июнь 4, 2010 01:07:59)
Офлайн
Lexanderесли не знаете монгу - можете с ней не заморачиваться, я для этого и веду тему на sql т.к. его знают многие, а перенести простое решение с sql на монгу запросто: селекты заменяем find'ами, вместо join используем вложеные элементы, вот и всеo7412369815963
база - MongoDB (sql привел для объяснения), сейчас в данной коллекции около 5000 документов, алгоритм хочу с расчетом на будущее (до 1млн), да и вообще полезно знать подобные алгоритмы
размер базы, думаю, в данном случае не важен, буть то он 1Мб или 1Гб. вставка идет одной/двумя командами - алгоритм не измениться. конечно может от размера БД хост будет плющить, тут уже распараллеливать , кластеризовать и т.д, но это уже совсем другая задача…o7412369815963:D
обычная sql: mysql, mssql, пострадж и подобные.
ЗЫ
Я отваливаю с этой темы.
Офлайн
o7412369815963:) Да ты не ищи проблем там где их нет.
я не про сложность, а про тяжесть. там джойн ( нужно получить 2 таблицы, состыковать их, потом отсортировать ), он гораздо тяжелее одного селекта
o7412369815963ChildId ненужен
значит есть таблица:
Id int
ParentId : ид родителя
ChildId : ид на элемент
Description nvarchar(30)
o7412369815963после вставки будет:
#есть 2 записи
1, null, x, x
2, null, x, x
#вставляем запись после 1-ой
1, null, x, x
2, null, x, x
3, 1, x, x
o7412369815963Результат тут нормальный. Это же double linked list то есть один елемент связан с другим. Если мешает названия можешь поменять на previuos_id, next_id, возможно яснее будет. Теперь сделай функцию для итерации от начала до конца и все (и неважно коким порядком данные пришли с дб, когда ты знаешь какой елемент стоит в переди и какой с зади).
получается такой (бессмысленный) результат:
Офлайн
дак это просто список получается, подбиваем результат:
* для вставки делается 2 запроса
* после выборки всех данных их нужно превращать в массив перед отдачей клиенту.
- т.к. это веб проект, то в основном будет происходить выборка данных, значить нагрузка выборки наносит больший удар на итоговую производительность чем нагрузка вставки
- если далее развивать проект, например постраничный вывод который есть почти на всех сайтах, то этот метод вообще не годиться т.к. вместо того что-б выдать 20 элементов для текущей страницы придется тащить все 5000 элементов, потом строить массив, и только из него брать те самые 20 элементов.
итого: этот вариант проигрывает варианту с генерацией кодов
Офлайн
o7412369815963Уж луче чем полмиллиона
для вставки делается 2 запроса
o7412369815963Да причем тут массив? Какая тебе разница в каком порядке данные будут внутри процесса. Разница тут только в итерации. Вместо for element in list: print.element, будешь писать while next: print element; next = element.next
после выборки всех данных их нужно превращать в массив перед отдачей клиенту.
o7412369815963Для этого можно сначала взять только id в кеш, сделать сортировку (как индекс в дб), а потом выбирать с “select in list” (для web страницы, данных же не будет много).
если далее развивать проект, например постраничный вывод который есть почти на всех сайтах, то этот метод вообще не годиться т.к. вместо того что-б выдать 20 элементов для текущей страницы придется тащить все 5000 элементов, потом строить массив, и только из него брать те самые 20 элементов.
Офлайн