powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как лучше хранить и сделать поиск по большому кол-ву данных
44 сообщений из 44, показаны все 2 страниц
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702361
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть задача сделать для сети отелей поиск свободного номера по дате.

Соответственно как вообще хранить статус номера в БД? У номера может быть 3 состояния, 1 - занят, 2 - свободен, 3 - промежуточное.

Дней в году 365.
Делать 365 колонок в таблице o_O ? И при поиске например свободного номера на 3 месяца составлять запрос по 90 колонкам?

Есть наверное более простое решение!?

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702387
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrixДней в году 365.
Делать 365 колонок в таблице o_O ?
Хранить периоды, а не дни
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702442
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GloryХранить периоды, а не дни

В смысле сделать 12 таблиц по 30 дней?
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702544
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие еще 12 таблиц ?
Одна единственная таблица
"ИД номера", "Статус", "Начало периода", "Конец периода"
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702552
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrixСоответственно как вообще хранить статус номера в БД? У номера может быть 3 состояния, 1 - занят, 2 - свободен, 3 - промежуточное.

Дней в году 365.
Делать 365 колонок в таблице o_O ? И при поиске например свободного номера на 3 месяца составлять запрос по 90 колонкам?


Блин, чё там 365 колонок ? Это ж каждый дурак сделает.

Делай 365 таблиц (366, если быть точным).
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702562
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
Блин, чё там 365 колонок ? Это ж каждый дурак сделает.

Делай 365 таблиц (366, если быть точным).

О, точно спасибо, так и сделаю. Как я сам-то не подумал.
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702579
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GloryКакие еще 12 таблиц ?
Одна единственная таблица
"ИД номера", "Статус", "Начало периода", "Конец периода"

Ну допустим у меня 100 различных номеров в сети отелей на 100 гостиниц.
И к примеру:
01.05 - статус номера 1 (занят)
02.05 - статус 3 (выселяется)
03.05 - статус 2 (свободен)
04.05 - статус 1 (занят)
и т.д.

Т.е. статус номера может каждый день меняться, как тут статус к периоду привязать?
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702612
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrixТ.е. статус номера может каждый день меняться, как тут статус к периоду привязать?
"ИД номера", "Статус", "Начало периода", "Конец периода"
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702640
Фотография -O_o-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrix
Тебе пока что 3-т таблиц хватит:
Таблица - с описанием твоих номеров
Таблица - со статусами
Таблица - в которой будет указанно какой номер занят на какой период. Соответсвенно если ты смотрешь номер сегодня, а номер занят будет еще 3-ри дня то у него статус "занят". Если период уже прошел, то статус свободен... както так.
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702686
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С периодами запросы будут монструозны. Я бы не парился и делал один день - одна запись.
Запросы вырождаются в простой not exists (... between...).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702691
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GlorysoftrixТ.е. статус номера может каждый день меняться, как тут статус к периоду привязать?
"ИД номера", "Статус", "Начало периода", "Конец периода"

Glory, Вы бы не могли чуть подробнее написать. Что Вы подразумеваете под периодами.
К примеру:
Начало периода: 01.05
Конец периода: 02.05
Если так, то получаем 365 строк в таблице на каждый номер? И как по ним поиск делать на конкретные даты?
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702711
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> С периодами запросы будут монструозны.

Что там монструозного ?


Я бы не парился и делал один день - одна
> запись.

Тогда эти записи нужно будет каждый день генерировать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702715
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrixЕсли так, то получаем 365 строк в таблице на каждый номер?
А вы что на год вперед знаете, когда номер заселен/освобжден что ли ?

softrixИ как по ним поиск делать на конкретные даты?
Хм. Указывать в тексте запроса условие поиска нарверное
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702728
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 миллиона записей. Или это норм?
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702734
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GloryА вы что на год вперед знаете, когда номер заселен/освобжден что ли ?


Ну номера бронируют за достаточно большой промежуток времени, на пиковые даты уже за год - пол года, может быть все забронировано, поэтому нужно учитывать возможность бронирования номеров на весь год.
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702752
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivТогда эти записи нужно будет каждый день генерировать.


Может для каждого номера, сразу генерировать 365 строк, а затем только Update делать?
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702807
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЧто там монструозного ?

Ну, лично я вот так с ходу не могу придумать запрос, который покажет список номеров,
свободных с 20.03.2012 по 25.04.2012 при хранении интервалов резервации.

softrixзаписывать только свободные даты
Скорее наоборот - только даты, когда номер не может быть зарезервирован (т.е. уже занят
или ещё что). Но, в принципе, действительно: заранее создать записи на год может оказаться
выгоднее в плане быстродействия.

Что до миллиона записей... Вряд ли MS SQL настолько слаб, что не потянет такую мелочь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702809
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrixМожет для каждого номера, сразу генерировать 365 строк, а затем только Update делать?
А чего не на 50-100 лет вперед тогда ?
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702823
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GloryА чего не на 50-100 лет вперед тогда ?

Ну дык он же не может сказать с уверенностью, что данный номер будет существовать через
100 лет. А на год вперёд - есть такая вероятность.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702842
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНу дык он же не может сказать с уверенностью, что данный номер будет существовать через
100 лет. А на год вперёд - есть такая вероятность.
Т.е. хранить 365 записей на номер - это нормально ? А 730 - уже ненормально ?
А если номер не будет ни разу заселен в течении года ?
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702922
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага, ну вроде со структурой таблицы понятно.

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)

Похоже на правду?
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702950
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GloryТ.е. хранить 365 записей на номер - это нормально ? А 730 - уже ненормально ?
А если номер не будет ни разу заселен в течении года ?

Ну чтобы номер не был заселен в течении года это мало вероятно, в принципе все 365 строк будут использованы. В такой схеме не удобно другое. Это то что к концу года будут уже бронироваться даты следующего года и как то нужно будет корректировать строки текущего года со следующим. Проще все-же делать просто новые записи под каждые забронированные даты, а старые стирать.
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37702998
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrixНу чтобы номер не был заселен в течении года это мало вероятно, в принципе все 365 строк будут использованы.
Эти 365 строк только будут место занимать.
Все информация из них умещается в одну запись
"2", "01.01.2012", "31.12.2012"
или вообще
"2", "01.01.2012", "31.12.9999"
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703028
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrixстарые стирать
Зачем? Они полезны для "разбора полётов".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703101
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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,
Ну в принципе, да или можно их в архив скидывать в конце года, чтобы таблицу не растить.
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703118
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrixЭто так, но при условии, что в любой момент времени забронирован весь год. Тогда и данные хранить смысла нет. :)
статус 2 (свободен)

Хранить надо события, которые произошли.
А не резервировать место, под события, которые возможно произойдут
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703125
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrixможно их в архив скидывать в конце года, чтобы таблицу не растить.

Зачем? У тебя аллергия на большие таблицы?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703254
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gloryстатус 2 (свободен)

Хранить надо события, которые произошли.
А не резервировать место, под события, которые возможно произойдут


Храним событие:
Есть бронь с 01.05 по 05.05
И бронь с 09.05 по 10.05
соответственно храним эти 2 события.
И как по ним поиск сделать?

Dimitry Sibiryakov Зачем? У тебя аллергия на большие таблицы?.


Ну мне кажется, что чем больше таблица тем медленнее она работает и медленнее по ней поиск, хотя может я не прав?
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703305
Gloreus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softrix,

Насколько большая? 1м записей - не много, при правильных индексах всё будет летать
у меня база около 30г, таблички по 16млн. есть, живём :)
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703340
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrixЕсть бронь с 01.05 по 05.05
И бронь с 09.05 по 10.05
соответственно храним эти 2 события.
И как по ним поиск сделать?
Поиск чего ?
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703426
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GloryПоиск чего ?
Ну к примеру, нужен свободный номер с 06.05 по 08.05
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703446
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrixНу к примеру, нужен свободный номер с 06.05 по 08.05
Это элементарная задача не пересечение периодов
where period1_beg > period2_end and period1_end < period2_beg
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703491
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GloryЭто элементарная задача не пересечение периодов
where period1_beg > period2_end and period1_end < period2_beg

Вы не можете писать конкретнее!?
period1_beg,period2_end,period1_end,period2_beg - что из этого переменная содержащая искомую дату, а что столбец таблицы?
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703497
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrixperiod1_beg,period2_end,period1_end,period2_beg - что из этого переменная содержащая искомую дату, а что столбец таблицы?
Это два периода
Все равно, что из них что
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703498
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только при пересечении периодов нужно аккуратно посмотреть чтобы с какой-то стороны были <= >= а с другой чистые < >. В школе на математике рисуют отрезки одна точка сплошная, другая - выколотая.
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703518
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GloryЭто два периода
Все равно, что из них что
А будут при таком поиске использоваться индексы?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703570
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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

Чет чепуха выходит. В этот запрос попадает первая бронь. И даже если бы не попадала, то максимум мы получим пустой результат если таблица содеждит только брони, а как свободный номер получить? Чет я запутался вообще.
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703592
softrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага вроде сообразил.

Можно искать номера которые на эти даты забронированны и вычитать их из выборки
типа

SELECT * from rooms where id not in (select * from shedule where period_start <= '06.05' and period_end >= '08.05' )

Glory, Вы это подразумевали?
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37703595
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недавно обсуждали.
http://www.sql.ru/forum/actualthread.aspx?tid=922331

2 Glory
Мое мнение: периоды здесь невыгодны. Лобовое решение - материализация в виде строчки на каждый день для каждого номера проще для восприятия, а значит написания, тестирования и поддержки. Плюс запрет накладок через ограничение уникальности проще и надежнее чем исключение через триггер.

softrix Нужно найти свободный номер с 06.05 по 08.05
Код: sql
1.
2.
3.
4.
5.
6.
select * from rooms r where not exists (select * from booking b where b.room_id=r.room_id and 
-- вариант Glory с периодами
not (book_end<=06.05 and 08.05<=book_start)
-- лобовой вариант 
book_date between 06.05 and 08.05
)
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37740806
SirMix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сделал бы две таблицы:

1) Текущее состояние номера
2) История

вторая таблица есть ничто иное как лог изменений состояний номера с датой начала и конца состояния.
при изменении состояния - в таблице истории закрываем старое состояние датой изменения и ложим новую строчку с датой изменения+секунда/час/день/месяц - в общем минимальная неделимая единица для этой даты - все!
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37741152
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SirMixсделал бы две таблицы:

1) Текущее состояние номера
2) История

вторая таблица есть ничто иное как лог изменений состояний номера с датой начала и конца состояния.
при изменении состояния - в таблице истории закрываем старое состояние датой изменения и ложим новую строчку с датой изменения+секунда/час/день/месяц - в общем минимальная неделимая единица для этой даты - все!Текущее состояние номера конечно нужно, но к задаче это не относится. Это как бы просто карточка номера, понятно, что она есть.

История здесь не нужна, нет же задачи получить реальное использование номера.
Тоесть может такая задача и есть, но вопрос не про неё.
SERG12572 Glory
Мое мнение: периоды здесь невыгодны. Лобовое решение - материализация в виде строчки на каждый день для каждого номера проще для восприятия, а значит написания, тестирования и поддержки. Плюс запрет накладок через ограничение уникальности проще и надежнее чем исключение через триггер.По моему тоже, номеро-дни более правильное решение таких задач...

К тому же, более просто решаются более сложные задачи, типа номер забронирован с 1 до 15, при этом с 1 по 5 там будет жить 2 человека, а с 6 нужно поставить ещё койку.
И всё это относится к одной брони.
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37741529
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softrixЕсть задача сделать для сети отелей поиск свободного номера по дате.
Есть наверное более простое решение!?
не простое, но правильное:
операции:
номер занят дата время
номер свободен дата время
номер зарезервирован дата время
статус расчитывать
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37741808
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrix,

Насчет периодов тебе правильно подсказали. Но учитывай особенность продления клиентом пребывания в номере. И вообще там есть целая куча моментов. Поэтому для начала пообщайся с администраторами отелей, думаю откроешь много нового в этом направлении. Я как-то сталкивался но неплотно, поэтому и посылаю к тем у кого найдешь ответы по структуре и методам работы. Зная это уже можно лепить таблицы. За оптимизацией набросков можешь приходить на форум.
...
Рейтинг: 0 / 0
Как лучше хранить и сделать поиск по большому кол-ву данных
    #37747310
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softrix, Вы извините, но как то странно рассуждаете о бронировании (о планировании работы производственного участка вашего предприятия). Для того, чтобы бронировать, Вы должны предоставить свободный ресурс для бронирования, правильно? Бронирование отнимает кусочки этого ресурса, но какие-то кусочки остаются все еще, правильно? А Вы рассуждаете о занятых кусочках при решении задачи бронирования все еще свободных)) Очень странно.
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как лучше хранить и сделать поиск по большому кол-ву данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]