PDA

Просмотр полной версии : [Вопрос] Система отелей (номера в отеле, вопрос)



StevenH
25.06.2017, 04:05
Здравствуйте, хотел спросить, как лучше организовать в системе отелей номера для игроков?

Предположим (ПРОСТО ПРИМЕР), у меня есть 5 отелей, где:
1 отель - 24 номера (2 этажа)
2 отель - 24 номера (2 этажа)
3 отель - 48 номеров (4 этажа)
4 отель - 24 номера (2 этажа)
5 отель - 96 номеров (8 этажей)

Так вот, как лучше это все организовать, как то в аккаунт игрока, или лучше стоит вовсе создать отдельную таблицу в БД, где все это реализовать?

$continue$
25.06.2017, 04:33
Может по структуре будет не очень, но:
account.sql:
id | name | password | hotel_id
hotel.sql:
id | owner | hotel_id |floor

hotel_id нужно связать внешним ключом (https://ru.wikipedia.org/wiki/%D0%92%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%B9_%D0%BA%D0%BB%D1%8E%D1%87).

StevenH
25.06.2017, 04:44
Может по структуре будет не очень, но:
account.sql:
id | name | password | hotel_id
hotel.sql:
id | owner | hotel_id |floor

hotel_id нужно связать внешним ключом (https://ru.wikipedia.org/wiki/%D0%92%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%B9_%D0%BA%D0%BB%D1%8E%D1%87).

И каким образом мне это все хранить? Как минимум, мне нужно хранить "где-то" 3 значения:
1. Номер отеля (hotel_id)
2. Номер этажа (hotel_floor)
3. Кол-во оплаченных дней (hotel_day)

DeimoS
25.06.2017, 12:26
Вот тут (http://forum.sa-mp.com/showthread.php?t=489467&highlight=%ED%EE%EC%E5%F0+%FD%F2%E0%E6%E0&page=9) обсуждали нечто схожее (эта и пара следующих страниц)

Fallen A.
25.06.2017, 13:12
И каким образом мне это все хранить? Как минимум, мне нужно хранить "где-то" 3 значения:
1. Номер отеля (hotel_id)
2. Номер этажа (hotel_floor)
3. Кол-во оплаченных дней (hotel_day)

Самое простое, это хранить список всех отелей в БД, номер этажа нет смысла записывать. Расположение входа в каждый номер будет по координатам из БД, ну и баланс счет номера записывай в этой же таблице. В таблице же игрока только порядковый ИД номера из базы и все. Остальное дело техники.

StevenH
25.06.2017, 13:57
Вот тут (http://forum.sa-mp.com/showthread.php?t=489467&highlight=%ED%EE%EC%E5%F0+%FD%F2%E0%E6%E0&page=9) обсуждали нечто схожее (эта и пара следующих страниц)

Ого, из за этих ироглифов ничего не могу понять, а гугл переводчик даже не переводит..
"À ïî÷åìó áû ïðîñòî íå ââåñòè ïîëå "ÀÄÐÅÑ", êîòîðîå áóäåò îáîçíà÷àòü êîíêðåòíóþ ìíîãîýòàæêó?" и подобное

DeimoS
25.06.2017, 14:00
Ого, из за этих ироглифов ничего не могу понять, а гугл переводчик даже не переводит..
"À ïî÷åìó áû ïðîñòî íå ââåñòè ïîëå "ÀÄÐÅÑ", êîòîðîå áóäåò îáîçíà÷àòü êîíêðåòíóþ ìíîãîýòàæêó?" и подобное

В самый низ страницы промотай и там переключи язык сайта с английского на русский.
В теме нет готового варианта, но там похожая ситуация: человеку нужна была система подъездов с несколькими этажами и прочим. И там рассматриваются несколько вариантов формирования таблицы. В общем, если чутка переработать их, получится ответ на твой вопрос

StevenH
25.06.2017, 14:30
В самый низ страницы промотай и там переключи язык сайта с английского на русский.
В теме нет готового варианта, но там похожая ситуация: человеку нужна была система подъездов с несколькими этажами и прочим. И там рассматриваются несколько вариантов формирования таблицы. В общем, если чутка переработать их, получится ответ на твой вопрос

Там столько разных мнений, что понял одно, что конечно лучше создать отдельную таблицу.

Теперь вопрос состоит в другом, как в таблице например hotel_room организовать работу, на уме вот что:
Создать таблицу hotel_room, где будут следующие поля:
id | hotel_id | hotel_floor | hotel_room | ownerid | day

id - AUTO_INCREMENT обычный
hotel_id - id отеля, который берется с таблицы hotels
hotel_floor - номер этажа в этом отеле (в каждом отеле их будет по разному)
hotel_room - номер квартиры на этом этаже (от 1 до 12)
ownerid - владелец (0 - нет, > 0 - ид аккаунта из accounts)
day - на сколько оплачен его номер в отеле

При создании одного отеля, в hotel_room добавлять нужное количество столбцов, если например в отеле 96 номеров, создать 96 столбцов.

В 00:00 каждый день будет делаться запрос (будет одним запросом отниматься 1 день с поля day), и будет сразу же проверяться, если day = 0, тогда выселяем

Или есть может какие другие предложения?

StevenH
25.06.2017, 15:56
А, и забыл добавить, в accounts.sql в поле hotel хранить ID с таблицы hotel_room поля id (тот самый AUTO_INCREMENT)

DeimoS
25.06.2017, 16:08
Я бы делал отдельную таблицу, которая хранит информацию о отеле, не связанную с игроками (позиция/количество номеров и т.п.), а так же таблицу, в которой уже будет связываться таблица аккаунтов и таблица отелей.

То бишь, какая-то такая структура получится:

id | account_id | hotel_id | room_id | day

То есть, всё то же самое, что и у тебя, только не хранить номер этажа (ибо зачем?).

И да, не нужно никаких запросов для "day" c отниманием. Есть же прекрасная штука: Unix Time. Вся чистка таблицы от старых записей заключается в

DELETE FROM hotel_room WHERE day < NOW()

StevenH
25.06.2017, 16:29
Я бы делал отдельную таблицу, которая хранит информацию о отеле, не связанную с игроками (позиция/количество номеров и т.п.), а так же таблицу, в которой уже будет связываться таблица аккаунтов и таблица отелей.

То бишь, какая-то такая структура получится:

id | account_id | hotel_id | room_id | day

То есть, всё то же самое, что и у тебя, только не хранить номер этажа (ибо зачем?).

И да, не нужно никаких запросов для "day" c отниманием. Есть же прекрасная штука: Unix Time. Вся чистка таблицы от старых записей заключается в

DELETE FROM hotel_room WHERE day < NOW()

Хорошо, а как мне узнать на каком этаже живет игрок в отеле?
Например есть отель, где 48 номеров (4 этажа), есть 1 интерьер типа "коридора" где находится 12 номеров, и у каждой двери написано само число, например:
1 этаж - 1..12 номер (interior №1)
2 этаж - 13..24 номер (interior №2)
3 этаж - 25..36 номер (interior №3)
4 этаж - 37..48 номер (interior №4)

Мне каким то образом нужно узнать номер его этажа и номер его комнаты на этом этаже, это нужно для того, чтобы тпшнуть игрока в нужный номер интерьера (пример выше)

DeimoS
25.06.2017, 17:59
Хорошо, а как мне узнать на каком этаже живет игрок в отеле?
Например есть отель, где 48 номеров (4 этажа), есть 1 интерьер типа "коридора" где находится 12 номеров, и у каждой двери написано само число, например:
1 этаж - 1..12 номер (interior №1)
2 этаж - 13..24 номер (interior №2)
3 этаж - 25..36 номер (interior №3)
4 этаж - 37..48 номер (interior №4)

Мне каким то образом нужно узнать номер его этажа и номер его комнаты на этом этаже, это нужно для того, чтобы тпшнуть игрока в нужный номер интерьера (пример выше)

Если у тебя в каждом этаже одинаковое количество квартир, просто математически узнавай это и всё.
Нужный номер интерьера можно получить так же математически (например "1000+hotel_id+room_id").

Ну, конечно, ты можешь и "вручную" хранить все номера этажей, но это затруднит ситуацию, если ты, например, решишь уменьшить количество квартир на этаже и перенести часть квартир на этаж выше, увеличив число этажей.
Я просто не знаю всей твоей задумки, поэтому могу говорить то, что тебе не подойдёт. Я сам всегда стараюсь автоматизировать все системы, дабы проще было вносить изменения при нужде и труднее было допустить ошибку (то бишь, системы строить так, чтоб нужно было лишь вносить какие-то базовые данные, а все остальные расчёты она делала сама). Потому и советую такое.

StevenH
25.06.2017, 18:27
Если у тебя в каждом этаже одинаковое количество квартир, просто математически узнавай это и всё.
Нужный номер интерьера можно получить так же математически (например "1000+hotel_id+room_id").

Ну, конечно, ты можешь и "вручную" хранить все номера этажей, но это затруднит ситуацию, если ты, например, решишь уменьшить количество квартир на этаже и перенести часть квартир на этаж выше, увеличив число этажей.
Я просто не знаю всей твоей задумки, поэтому могу говорить то, что тебе не подойдёт. Я сам всегда стараюсь автоматизировать все системы, дабы проще было вносить изменения при нужде и труднее было допустить ошибку (то бишь, системы строить так, чтоб нужно было лишь вносить какие-то базовые данные, а все остальные расчёты она делала сама). Потому и советую такое.

Я убрал поле floor (этаж), и сделал обычные номера. Теперь вопрос и одновременно проблема вот в чем: как математически (например) можно узнать номер этажа и сам номер на этом этаже.

Например, если в поле room_id = 56, то по сути это 5 этаж и 8 номер (на этом самом 5 этаже). То есть получается что у нас есть? Каждые 12 номеров = новому этажу (1..12 - 1 этаж, 13..24 - 2 этаж и тд).

Если room_id = 43, то это получается 3 этаж, и на этом 3 этаже комната #7

DeimoS
25.06.2017, 19:52
new floor = room_id/12,
room_on_floor = room_id&12;
?

StevenH
25.06.2017, 22:28
new floor = room_id/12,
room_on_floor = room_id&12;
?

room_id&12; ???
Может room_id%12;

Завтра попробую в любой случае что уж получится на практике, в принципе половину смог реализовать уже