Здания на локациях - организация бд
| |
JanCarlo | Дата: Четверг, 31 Марта 2022, 21:16 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Добрый вечер!
Подсобите советом как организовать грамотно структуру базы которая отвечает за установку зданий на локации.
Игра браузерная, текстовая, на ларке. Решаю вопрос связи зданий с локациями по бд. Большинство локаций не имеют отношения к игровой механике, только бои и монстры на локациях. Но некоторые локации ключевые.
Допустим банк на локации, госпиталь лечебный, магазин и прочее. Игрок приходит на локацию, название, описание и координаты подгружаются из таблицы rooms.
1) Сейчас есть база локаций (таблица rooms, поля x/y/z/name/description/room_type_id/zone_id). Допустим: id475/5/5/5/Вход в пещеру/Севернее виднеется проход в пещеру/1/1
2) Есть таблица room_types (room_id / name / type) - Общая таблица типов зданий (под каждый тип зданий своя отдельная таблица) Допустим: id1- 475 / Банк / bank id2 - 476 / Магазин / shop
3) Есть таблица конкретно банков room_type_banks (room_id / name / description и будут добавляться еще поля отвечающие за логику банка) Допустим: 475 / СверхВыгодный банк / Здесь вы можете сохранить свои честно награбленные деньги!
Суть в том, что структура самих локаций меняться не будет, если только дополняться. А вот зданий будет много и логика их работы будет очень разная. Магазинов как и банков как и других зданий будет много.
Я подумал так, что перед отрисовкой локации, где я из бд дергаю данные от самой локации, я буду дополнительно идти в общую таблицу зданий, и выяснять тип здания на локации по её ИД.
Далее из модели общих зданий я свичом распределяю запросы, типа если тип локации bank, то идем в подТаблицу room_type_banks и по ид локации находим запись банка который принадлежит к этой локации.
Всё бы ничего, вроде более менее универсально получается. Таким образом я собрал все данные о банке находящемся на этой локации и таким образом я могу собирать и все остальные данные о других зданиях.
Но, вопрос!
К примеру банк имеет возможность открыть счет игроку (разово) если счета нет, если счет есть то отрисовывается форма управления своим счетом, кнопка историй переводов и так далее, история переводов идет в отделный component во вью. Допустим открытие нового счета идет по маршруту /createBankAccount - по этому пути в контроллер передаются данные о юзере и в контроллере есть метод create который откроет юзеру счет. Ну и другие методы управления счетом.
Каким образом мне собирать данные о других типах зданий и так же универсально отправлять во вью? Не могу же я во вью писать логику под каждый тип здания. В целом не совсем понятно, как после сбора сведений о типе зданий выбрать необходимый blade шаблон для отрисовки здания. У каждого типа здания может быть несколько маршрутов и всё это будет сильно отличаться от других типов зданий. Допустим у банка маршрут на создание счета, на переводы/пополнение, маршрут на историю транзакций. А у здания госпиталя один маршрут - отхилить игрока и всё.
Возможно просто на каждый типа зданий заготовить заранее все необходимые шаблоны, которые будут содержать все необходимые маршруты, останется додумать как выбрать шаблоны в зависимости от типа здания.
Да и в целом, хороша ли такая концепция? Я такое первый раз пишу.
VK группа игры (Разработка c 22 года): https://vk.com/browsermud
Сообщение отредактировал JanCarlo - Четверг, 31 Марта 2022, 21:23 |
|
| |
lvovand | Дата: Пятница, 01 Апреля 2022, 09:31 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| как видится наброском: есть какой-то общий класс для зданий, а каждый конкретный тип здания уже наследует общие правила и добавляет свои методы. Вью раздельные то наверно не самая большая сложность, вот с хранением данных - либо разные таблицы, либо объекты сохранять надо будет в полях таблицы, либо часть данных хранить в noSQL
Разработка и продвижение сайтов. Дизайн
|
|
| |
TLT | Дата: Пятница, 01 Апреля 2022, 09:39 | Сообщение # 3 |
Сейчас на сайте
| Цитата JanCarlo ( ) Возможно просто на каждый типа зданий заготовить заранее все необходимые шаблоны, которые будут содержать все необходимые маршруты, останется додумать как выбрать шаблоны в зависимости от типа здания.
Если отличия кардинальные, то лучше для каждого типа делать отдельный шаблон, я думаю. Я бы вообще делал как в "Героях" - со своим фоном, звуком, индивидуальными фичами. А вообще, я бы посмотрел, как это выполнено в похожей игре - найди на GitHub открытый аналог, шаблон похожей игры с БД зданий и перенимай опыт.
Дао, выраженное словами, не есть истинное Дао.
|
|
| |
maker-rus | Дата: Суббота, 02 Апреля 2022, 22:54 | Сообщение # 4 |
Гений
Сейчас нет на сайте
| JanCarlo, первое, что необходимо для проектировки базы данных - умение формулировать мысли, что в топике практически отсутствует и читается он, как:
Цитата у меня есть три рубля и однажды, когда я читал историю на форуме, то пошел в магазин и короче мы кушали конфетки, когда смотрели телевизор Слишком сумбурно. Из того, что мне удалось понять:
- Нужен совет, по поводу организации хранения типов зданий в базе данных
- Используется Laravel (PHP)
- Есть три таблицы: rooms (x / y / z / name / description / room_type_id /zone_id), room_types (room_id / name / type) и room_type_banks (room_id / name / description)
- Можно создавать локации
- Созданные локации не будут меняться
- Есть возможность создавать различные игровые объекты, в виде зданий
- Один и тот же тип может иметь разную функциональность, в различных условиях
Изначально остановлюсь на формулировке таблиц, есть три таблицы, где одна из них расширяет другую. Я считаю такой подход максимально неудачным. Так как при создании других зданий, придется создавать новую таблицу и так до бесконечности. Расширение у такого подхода - максимально больное. Что делать? Отказаться от таблиц типа room_type_названиездания.
Какая замена? Замена достаточно простая. Создать таблицу, которая хранит в себе все возможные виды зданий. Пример таблицы build_list:
- id [PK]
- type_name [VARCHAR] - наименования типа постройки, например: bank, tavern, shop, arena
- title [VARCHAR] - название постройки, например: магазин сладостей, арена смерти, банк TLT Ltd.
- action [VARCHAR] - наименование класса отвечающего за этот объект, например CandyShop.
В итоге, каждый класс отвечающий за то или иное здание работает со своим зданием так, как считает нужным. А в отображении или как говорил автор топика "вью" указывается ссылка на "маршрут", по типу /build/102, или /build?id=102. Внутри контроллера, который обрабатывает маршрут вызывать нужный класс для обработки.
Пример, у нас есть здание: Магазинчик сладостей, алгоритм будет такой:
- Переход по условной ссылке: www.mysupergame.ru/build/653
- Вызывается метод контроллера BuildController, например index. То есть вызов будет таким BuildController::index(id).
- В методе index мы получаем по id = 653 из таблицы build_list нужное нам здание, допустим, что по этому id там находится запись: id = 653, type_name=shop, title=Магазинчик сладостей, action=CandyShop.
- Получив запись, получаем из нее значение action = CandyShop. Теперь мы знаем какой класс нужно вызвать.
- Создаем объект класса CandyShop и передаем в него все нужные значения через конструктор, либо с использованием шаблона "строитель".
- Что-то делаем, используя этот класс, например: загружаем все доступные для персонажа сладости.
- Вызываем метод класса, который возвращает название шаблона, например: шаблон с названием shop/candy_shop.blade
- Вызываем через встроенную функцию отображение шаблона и туда передаем данные, что были получены в результате работы класса CandyShop, например: вызвав метод, который возвращает полученные из базы данных все доступные для игрока сладости, по типу CandyShop->getCandies(): array, который возвращает массив из сладостей.
- В отображенном шаблоне выводим доступные сладости, используя функциональность шаблонизатора
- Профит
|
|
| |
JanCarlo | Дата: Понедельник, 04 Апреля 2022, 09:56 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Господа, всем спасибо. maker-rus, Действительно, сумбурно я всё написал. В целом вы всё поняли верно, кроме последнего пункта "один и тот же тип может иметь разную функциональность", тут не совсем так. Вот к примеру есть тип здания банк - банков может быть много и они могут иметь разные названия и описания, а механика одна и та же. Открытие счета, переводы, снятие и тд. Другой тип здания допустим завод, там вообще совсем другая механика.
Во всём остальном всё верно и я попробую сделать так как вы сказали. Я собственно изначально думал сделать примерно так, но что то отошел в сторону Опыта в этом смысле маловато
VK группа игры (Разработка c 22 года): https://vk.com/browsermud
|
|
| |
Эргалон | Дата: Понедельник, 04 Апреля 2022, 16:26 | Сообщение # 6 |
Вездесущий
Сейчас нет на сайте
| JanCarlo, применяй наследование. BaseBank - функционал, в котором вся логика и одинаковые данные для всех банков, дальше уже NewBank extends BaseBank. Если надо здания, то соответствено NewBank extends BaseBank extends BuildingBase. В твоем случае что-то вроде NewFactory extends BuildingBase. В базе данных примерно такая же организация. Должен быть стартовый шаблон для любого здания, в данном случае BuildingBase. Его наследуют все прочие здания, собственно из базы ты также должен вытягивать инфу о шаблоне, к которому привязаны другие сущности/здания
Кубариум Rise of the dark lords
Сообщение отредактировал Эргалон - Понедельник, 04 Апреля 2022, 16:33 |
|
| |
|