Проектирование бд, нужна помощь

12
Kait
На сайте с 28.02.2012
Offline
37
1007

Добрый день, товарищи.

Помогите новичку спроектировать базу заявок в бой и боев.

Немного конкретики: бои могут быть два вида - одиночные и групповые(от трех до 30 чел. в бою).

Что я делаю? Создаю одну таблицу заявок с 34 столбцами(ид заявки, количество человек макс в заявке, текущее количество человек в заявке, время создания, и 30 столбцов с идами игроков). Соответственно, получается, что если создали заявку на 13 человек(или столько человек успели вступить), то остальные столбцы будут пустовать. Айс?

С проектированием боя еще сложнее. Бой полем 15*15. Идея не делать координаты поле боя в таблице не выходит - кроме игроков в бое имеются препятствия, вызываемые существа. Конечно, всем обьектам можно прописать просто ид боя, а не вписывать иды обьектов в таблицу боя. Насколько разумно делать таблицу боев с 15*15(координаты поля, где в каждой клетке или 0(пусто), 1(препятствие), ид юзера или ид обьекта)+ид боя столбцов?

IL
На сайте с 20.04.2007
Offline
435
#1
Kait:
с 34 столбцами(ид заявки, количество человек макс в заявке, текущее количество человек в заявке, время создания, и 30 столбцов с идами игроков). Соответственно, получается, что если создали заявку на 13 человек(или столько человек успели вступить), то остальные столбцы будут пустовать. Айс?

???

Делается через таблицу many-many id_user id_battle (или какой там бой.. по англицки будет.), при необходимости доп поля (время входа юзера в бой, время выхода, итд)

в таблице боёв - инфа исключительно о бое.

Kait:
Бой полем 15*15.

как вариант - длинная "простыня" (на примере многоходового боя):

id_battle id_tick (тик/ход) type (пользователь, препятствие итд) id_obj (ид-

шник объекта типа type), доп инфо (статы-жизни, action=что сделал, направление=куда смотрит) итд

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
Kait
На сайте с 28.02.2012
Offline
37
#2

Так, спасибо. Пойду изучать.

Kait
На сайте с 28.02.2012
Offline
37
#3

Если я вас правильно понял:

Значит, у нас будет две таблицы: заявки - id_user id_zayavka. И заявки_параметр - id_zayavka, parametr(макс. кол. чел., время действия заявки). ?

Насчет боя:

Будет таблица боев: id_battle, id_tick(ход), id_user, action(что сделал, если ударил - ид_юзера, если сходил или оделся и т.д. - параметр какой-нибудь), value.

Делаем еще таблицу: id_battle, id_user, status(сходил/не сходил), xp.

Но если бой на время, которое и формирует ход. Каждый ход по минуте(за которую все должны успеть сходить один раз). Создаем еще таблицу боев, где id_battle, max_users, max_sxodilo, timer.

Как-то так?

IL
На сайте с 20.04.2007
Offline
435
#4
Kait:
id_battle, id_tick(ход), id_user,

это primary key

каждый юзер может сходить за конкретный ход в конкретном бою только 1 раз.

Инфу о том, что пользователь сходил - записываем в эту таблицу.

Если юзер 356 за 3-й ход в 155-м бою не сходил, то строчки с 155/3/356 не будет.

Если же сходил - в этой строчке должна лежать вся инфа о его ходе.

Таймер можно разместить в таблице боёв или вообще рассчитывать его (есть датавремя начала боя, есть 1 ход в минуту, есть текущее время).

p.s. зачем хранить max_shodilo (в смысле, что это даёт)?

Kait
На сайте с 28.02.2012
Offline
37
#5

Max_shodilo - если равно max_users, то значит все сходили и можно начинать новый ход, не дожидаясь окончания времени хода.

Злобный Гыук
На сайте с 30.08.2007
Offline
83
#6

Для таких вещей лучше использовать nosql базы, вроде mongodb... в противном случае, бд начинает тормозить уже при нескольких десятков одновременных боёв.

SEO-api для программистов (/ru/forum/869285)
Kait
На сайте с 28.02.2012
Offline
37
#7

Да не, если все норм сделать, должно держать. При нескольких десятках(30) одновременных боев(с 15 чел в каждом) около 45 000 записей будет в таблице боев-ходов при достижении всеми боями 100-го раунда, это немного. Да и вряд ли, такие масштабы будут, я так, практикуюсь, не более. Законченные бои , конечно, будут выгружаться в архив. Но я теоретик - новичок, утверждать особо не могу. Практикуюсь вот.

Злобный Гыук
На сайте с 30.08.2007
Offline
83
#8

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

IL
На сайте с 20.04.2007
Offline
435
#9
Злобный Гыук:
а если историю хранить, то получатся таблицы с многими миллионами записей.

Текущие бои в Memory хранить, архив - в MyISAM (меняться они вряд ли будут) или в InnoDB. Для начала - даже на шареде пойдёт.

Злобный Гыук:
Пишите пока на том, что знаете. Многие проекты так и умирают недожив до рабочего релиза...

Обнадёживающе :D

Kait:
При нескольких десятках(30) одновременных боев(с 15 чел в каждом) около 45 000 записей будет в таблице

Это 450 активных игроков онлайн.. много это или мало (в смысле, завышенное или заниженное число) - Вам виднее.

edogs software
На сайте с 15.12.2005
Offline
775
#10
Kait:
Добрый день, товарищи.

Помогите новичку спроектировать базу заявок в бой и боев.

Немного конкретики: бои могут быть два вида - одиночные и групповые(от трех до 30 чел. в бою).

Что я делаю? Создаю одну таблицу заявок с 34 столбцами(ид заявки, количество человек макс в заявке, текущее количество человек в заявке, время создания, и 30 столбцов с идами игроков). Соответственно, получается, что если создали заявку на 13 человек(или столько человек успели вступить), то остальные столбцы будут пустовать. Айс?

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

Kait:
С проектированием боя еще сложнее. Бой полем 15*15. Идея не делать координаты поле боя в таблице не выходит - кроме игроков в бое имеются препятствия, вызываемые существа. Конечно, всем обьектам можно прописать просто ид боя, а не вписывать иды обьектов в таблицу боя. Насколько разумно делать таблицу боев с 15*15(координаты поля, где в каждой клетке или 0(пусто), 1(препятствие), ид юзера или ид обьекта)+ид боя столбцов?

Под бой вообще нет смысла разводить данные на ячейки. Сделайте базу данных из ИД, ТЕКСТ и в текст складываете сериализованные данные о бое.

ivan-lev:
???
Делается через таблицу many-many id_user id_battle (или какой там бой.. по англицки будет.), при необходимости доп поля (время входа юзера в бой, время выхода, итд)
в таблице боёв - инфа исключительно о бое.

Мы бы согласились с Вами в большинстве случаев, но не в этом. По сути у ТС в задаче нет ничего, для чего нужно SQL с одной стороны. С другой стороны при EAV решении будет нехилое раздувание таблицы, при этом высоконагруженной таблицы. А ведь nosql решение и/или пусть даже sql решение но без eav - позволило бы обойтись без этого.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий