|
|
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
Есть задача сделать для сети отелей поиск свободного номера по дате. Соответственно как вообще хранить статус номера в БД? У номера может быть 3 состояния, 1 - занят, 2 - свободен, 3 - промежуточное. Дней в году 365. Делать 365 колонок в таблице o_O ? И при поиске например свободного номера на 3 месяца составлять запрос по 90 колонкам? Есть наверное более простое решение!? Модератор: Тема перенесена из форума "Microsoft SQL Server". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 12:17 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrixДней в году 365. Делать 365 колонок в таблице o_O ? Хранить периоды, а не дни ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 12:24 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
GloryХранить периоды, а не дни В смысле сделать 12 таблиц по 30 дней? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 12:40 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
Какие еще 12 таблиц ? Одна единственная таблица "ИД номера", "Статус", "Начало периода", "Конец периода" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 13:19 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrixСоответственно как вообще хранить статус номера в БД? У номера может быть 3 состояния, 1 - занят, 2 - свободен, 3 - промежуточное. Дней в году 365. Делать 365 колонок в таблице o_O ? И при поиске например свободного номера на 3 месяца составлять запрос по 90 колонкам? Блин, чё там 365 колонок ? Это ж каждый дурак сделает. Делай 365 таблиц (366, если быть точным). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 13:23 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
MasterZiv Блин, чё там 365 колонок ? Это ж каждый дурак сделает. Делай 365 таблиц (366, если быть точным). О, точно спасибо, так и сделаю. Как я сам-то не подумал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 13:28 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
GloryКакие еще 12 таблиц ? Одна единственная таблица "ИД номера", "Статус", "Начало периода", "Конец периода" Ну допустим у меня 100 различных номеров в сети отелей на 100 гостиниц. И к примеру: 01.05 - статус номера 1 (занят) 02.05 - статус 3 (выселяется) 03.05 - статус 2 (свободен) 04.05 - статус 1 (занят) и т.д. Т.е. статус номера может каждый день меняться, как тут статус к периоду привязать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 13:36 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrixТ.е. статус номера может каждый день меняться, как тут статус к периоду привязать? "ИД номера", "Статус", "Начало периода", "Конец периода" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 13:48 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrix Тебе пока что 3-т таблиц хватит: Таблица - с описанием твоих номеров Таблица - со статусами Таблица - в которой будет указанно какой номер занят на какой период. Соответсвенно если ты смотрешь номер сегодня, а номер занят будет еще 3-ри дня то у него статус "занят". Если период уже прошел, то статус свободен... както так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 13:58 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
С периодами запросы будут монструозны. Я бы не парился и делал один день - одна запись. Запросы вырождаются в простой not exists (... between...). Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 14:13 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
GlorysoftrixТ.е. статус номера может каждый день меняться, как тут статус к периоду привязать? "ИД номера", "Статус", "Начало периода", "Конец периода" Glory, Вы бы не могли чуть подробнее написать. Что Вы подразумеваете под периодами. К примеру: Начало периода: 01.05 Конец периода: 02.05 Если так, то получаем 365 строк в таблице на каждый номер? И как по ним поиск делать на конкретные даты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 14:15 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
> С периодами запросы будут монструозны. Что там монструозного ? Я бы не парился и делал один день - одна > запись. Тогда эти записи нужно будет каждый день генерировать. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 14:23 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrixЕсли так, то получаем 365 строк в таблице на каждый номер? А вы что на год вперед знаете, когда номер заселен/освобжден что ли ? softrixИ как по ним поиск делать на конкретные даты? Хм. Указывать в тексте запроса условие поиска нарверное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 14:24 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovС периодами запросы будут монструозны. Я бы не парился и делал один день - одна запись. Запросы вырождаются в простой not exists (... between...). Т.е. Если я правильно понял Вы предлагаете таблицу вида id status_id date И соответственно записывать только свободные даты. А поиск делать вида Select * from table where status_id=1 and date beetwen 01.05.2012 and 25.05.2012 Только если у нас 3000 номеров, то объем таблицы может вырасти до 1 миллиона записей. Или это норм? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 14:29 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
GloryА вы что на год вперед знаете, когда номер заселен/освобжден что ли ? Ну номера бронируют за достаточно большой промежуток времени, на пиковые даты уже за год - пол года, может быть все забронировано, поэтому нужно учитывать возможность бронирования номеров на весь год. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 14:33 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
MasterZivТогда эти записи нужно будет каждый день генерировать. Может для каждого номера, сразу генерировать 365 строк, а затем только Update делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 14:37 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
MasterZivЧто там монструозного ? Ну, лично я вот так с ходу не могу придумать запрос, который покажет список номеров, свободных с 20.03.2012 по 25.04.2012 при хранении интервалов резервации. softrixзаписывать только свободные даты Скорее наоборот - только даты, когда номер не может быть зарезервирован (т.е. уже занят или ещё что). Но, в принципе, действительно: заранее создать записи на год может оказаться выгоднее в плане быстродействия. Что до миллиона записей... Вряд ли MS SQL настолько слаб, что не потянет такую мелочь. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 14:53 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrixМожет для каждого номера, сразу генерировать 365 строк, а затем только Update делать? А чего не на 50-100 лет вперед тогда ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 14:53 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
GloryА чего не на 50-100 лет вперед тогда ? Ну дык он же не может сказать с уверенностью, что данный номер будет существовать через 100 лет. А на год вперёд - есть такая вероятность. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 14:58 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovНу дык он же не может сказать с уверенностью, что данный номер будет существовать через 100 лет. А на год вперёд - есть такая вероятность. Т.е. хранить 365 записей на номер - это нормально ? А 730 - уже ненормально ? А если номер не будет ни разу заселен в течении года ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 15:04 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
Ага, ну вроде со структурой таблицы понятно. id room_id status date А, как по ней поиск cделать? Если добавлять в таблицу только забронированные даты то поиск может выглядеть как-то так: SELECT * FROM `rooms` as r WHERE r.id not in (select s.room_id from shedule as s where s.status=2 or s.status=3 beetwen 01.05.2012 and 25.05.2012 group by room_id) Похоже на правду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 15:27 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
GloryТ.е. хранить 365 записей на номер - это нормально ? А 730 - уже ненормально ? А если номер не будет ни разу заселен в течении года ? Ну чтобы номер не был заселен в течении года это мало вероятно, в принципе все 365 строк будут использованы. В такой схеме не удобно другое. Это то что к концу года будут уже бронироваться даты следующего года и как то нужно будет корректировать строки текущего года со следующим. Проще все-же делать просто новые записи под каждые забронированные даты, а старые стирать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 15:35 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrixНу чтобы номер не был заселен в течении года это мало вероятно, в принципе все 365 строк будут использованы. Эти 365 строк только будут место занимать. Все информация из них умещается в одну запись "2", "01.01.2012", "31.12.2012" или вообще "2", "01.01.2012", "31.12.9999" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 15:51 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrixстарые стирать Зачем? Они полезны для "разбора полётов". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 16:03 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
GloryЭти 365 строк только будут место занимать. Все информация из них умещается в одну запись "2", "01.01.2012", "31.12.2012" или вообще "2", "01.01.2012", "31.12.9999" Это так, но при условии, что в любой момент времени забронирован весь год. Тогда и данные хранить смысла нет. :) А, по факту будет примерно так: На сегодняшний день забронировано: "2", "01.01.2012", "02.01.2012" "2", "03.01.2012", "05.01.2012" "2", "06.01.2012", "08.01.2012" "2", "21.01.2012", "22.01.2012" На завтра, часть дат с брони снято. На после завтра, часть дат перебронированны на новые. и т.п. Dimitry Sibiryakov, Ну в принципе, да или можно их в архив скидывать в конце года, чтобы таблицу не растить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 16:28 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrixЭто так, но при условии, что в любой момент времени забронирован весь год. Тогда и данные хранить смысла нет. :) статус 2 (свободен) Хранить надо события, которые произошли. А не резервировать место, под события, которые возможно произойдут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 16:33 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrixможно их в архив скидывать в конце года, чтобы таблицу не растить. Зачем? У тебя аллергия на большие таблицы?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 16:38 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
Gloryстатус 2 (свободен) Хранить надо события, которые произошли. А не резервировать место, под события, которые возможно произойдут Храним событие: Есть бронь с 01.05 по 05.05 И бронь с 09.05 по 10.05 соответственно храним эти 2 события. И как по ним поиск сделать? Dimitry Sibiryakov Зачем? У тебя аллергия на большие таблицы?. Ну мне кажется, что чем больше таблица тем медленнее она работает и медленнее по ней поиск, хотя может я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 17:17 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrix, Насколько большая? 1м записей - не много, при правильных индексах всё будет летать у меня база около 30г, таблички по 16млн. есть, живём :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 17:31 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrixЕсть бронь с 01.05 по 05.05 И бронь с 09.05 по 10.05 соответственно храним эти 2 события. И как по ним поиск сделать? Поиск чего ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 17:44 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
GloryПоиск чего ? Ну к примеру, нужен свободный номер с 06.05 по 08.05 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 18:15 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrixНу к примеру, нужен свободный номер с 06.05 по 08.05 Это элементарная задача не пересечение периодов where period1_beg > period2_end and period1_end < period2_beg ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 18:27 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
GloryЭто элементарная задача не пересечение периодов where period1_beg > period2_end and period1_end < period2_beg Вы не можете писать конкретнее!? period1_beg,period2_end,period1_end,period2_beg - что из этого переменная содержащая искомую дату, а что столбец таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 18:54 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrixperiod1_beg,period2_end,period1_end,period2_beg - что из этого переменная содержащая искомую дату, а что столбец таблицы? Это два периода Все равно, что из них что ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 18:56 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
Только при пересечении периодов нужно аккуратно посмотреть чтобы с какой-то стороны были <= >= а с другой чистые < >. В школе на математике рисуют отрезки одна точка сплошная, другая - выколотая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 18:56 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
GloryЭто два периода Все равно, что из них что А будут при таком поиске использоваться индексы? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 19:08 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
GloryЭто два периода Все равно, что из них что Таблица содержит 2 события бронь с 01.05 по 05.05 (статус 2) бронь с 09.05 по 10.05 (статус 2) Нужно найти свободный номер с 06.05 по 08.05 Если сделать так: select room_id from shedule where period_end > 06.05 and period_start < 08.05 and status_id=2 Чет чепуха выходит. В этот запрос попадает первая бронь. И даже если бы не попадала, то максимум мы получим пустой результат если таблица содеждит только брони, а как свободный номер получить? Чет я запутался вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 19:38 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
Ага вроде сообразил. Можно искать номера которые на эти даты забронированны и вычитать их из выборки типа SELECT * from rooms where id not in (select * from shedule where period_start <= '06.05' and period_end >= '08.05' ) Glory, Вы это подразумевали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 19:58 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
Недавно обсуждали. http://www.sql.ru/forum/actualthread.aspx?tid=922331 2 Glory Мое мнение: периоды здесь невыгодны. Лобовое решение - материализация в виде строчки на каждый день для каждого номера проще для восприятия, а значит написания, тестирования и поддержки. Плюс запрет накладок через ограничение уникальности проще и надежнее чем исключение через триггер. softrix Нужно найти свободный номер с 06.05 по 08.05 Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2012, 20:02 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
сделал бы две таблицы: 1) Текущее состояние номера 2) История вторая таблица есть ничто иное как лог изменений состояний номера с датой начала и конца состояния. при изменении состояния - в таблице истории закрываем старое состояние датой изменения и ложим новую строчку с датой изменения+секунда/час/день/месяц - в общем минимальная неделимая единица для этой даты - все! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2012, 18:15 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
SirMixсделал бы две таблицы: 1) Текущее состояние номера 2) История вторая таблица есть ничто иное как лог изменений состояний номера с датой начала и конца состояния. при изменении состояния - в таблице истории закрываем старое состояние датой изменения и ложим новую строчку с датой изменения+секунда/час/день/месяц - в общем минимальная неделимая единица для этой даты - все!Текущее состояние номера конечно нужно, но к задаче это не относится. Это как бы просто карточка номера, понятно, что она есть. История здесь не нужна, нет же задачи получить реальное использование номера. Тоесть может такая задача и есть, но вопрос не про неё. SERG12572 Glory Мое мнение: периоды здесь невыгодны. Лобовое решение - материализация в виде строчки на каждый день для каждого номера проще для восприятия, а значит написания, тестирования и поддержки. Плюс запрет накладок через ограничение уникальности проще и надежнее чем исключение через триггер.По моему тоже, номеро-дни более правильное решение таких задач... К тому же, более просто решаются более сложные задачи, типа номер забронирован с 1 до 15, при этом с 1 по 5 там будет жить 2 человека, а с 6 нужно поставить ещё койку. И всё это относится к одной брони. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2012, 22:55 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrixЕсть задача сделать для сети отелей поиск свободного номера по дате. Есть наверное более простое решение!? не простое, но правильное: операции: номер занят дата время номер свободен дата время номер зарезервирован дата время статус расчитывать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2012, 10:49 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrix, Насчет периодов тебе правильно подсказали. Но учитывай особенность продления клиентом пребывания в номере. И вообще там есть целая куча моментов. Поэтому для начала пообщайся с администраторами отелей, думаю откроешь много нового в этом направлении. Я как-то сталкивался но неплотно, поэтому и посылаю к тем у кого найдешь ответы по структуре и методам работы. Зная это уже можно лепить таблицы. За оптимизацией набросков можешь приходить на форум. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2012, 12:58 |
|
||
|
Как лучше хранить и сделать поиск по большому кол-ву данных
|
|||
|---|---|---|---|
|
#18+
softrix, Вы извините, но как то странно рассуждаете о бронировании (о планировании работы производственного участка вашего предприятия). Для того, чтобы бронировать, Вы должны предоставить свободный ресурс для бронирования, правильно? Бронирование отнимает кусочки этого ресурса, но какие-то кусочки остаются все еще, правильно? А Вы рассуждаете о занятых кусочках при решении задачи бронирования все еще свободных)) Очень странно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2012, 17:28 |
|
||
|
|

start [/forum/topic.php?all=1&fid=32&tid=1541748]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
144ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 436ms |

| 0 / 0 |
