|
|
|
Создание связи между двумя сущностями
|
|||
|---|---|---|---|
|
#18+
ewb Если уточнить, то фичи это по сути некие счетчики - цифры присущие каждому игроку, числа эти постоянно меняются, некоторые только в большую сторону, некоторые в обе стороны. То есть одинаково важны, как скорость выборки, так и скорость апдейта. Пример: 1) хранить сколько и каких монстров убил игрок. 2) сколько и каких монстров создал игрок 3) сколько и каких артефактов у него имеется 4) Какие ачивки открыты И так далее, всего уже 12 таких сущностей с количеством элементов от 2 до 18 в каждой, которое может варьироваться. К тому же прибавятся еще и сами сущности. Это всё не проблема. Запросы будут быстрыми как на чтение, так и на изменение, при условии, что везде будет фильтр по одному игроку. А он тут есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2012, 20:27 |
|
||
|
Создание связи между двумя сущностями
|
|||
|---|---|---|---|
|
#18+
ewbСпасибо! Я действительно все пересмотрел, понял всю не достаточную гибкость в обслуживание при варианте 2 и 3, особенно скорее 2. И нашел больше плюсов в первом, кроме того, скорость выборки при тестах там практически ничем не уступает второму варианту, но вот апдейты будут происходить в несколько раз медленней, ввиду нескольких запросов на апдейт сразу, но удобство добавление новых элементов это компенсирует. Я думаю, ты ошибаешься. Поясни, какие UPDATE-ы будут происходить в несколько раз медленнее ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2012, 20:28 |
|
||
|
Создание связи между двумя сущностями
|
|||
|---|---|---|---|
|
#18+
ewb, проверил, действительно какая-то фигня. 95 метров на 150тыщ связей... получается по 35 байт на 3 unsigned int и 1 tiny int (ожидалось 3*4+1 = 13 байт)! Положим не в 20, а всего в 11 раз больше ( 95мб таблица связи + 4.7мб таблица юзверей против 8,7м вариант 2)... но всё равно фигня. Особенно если учесть что взят формат InnoDb "compact". индексов там тоже "мало не покажется" получилось. Потому что на каждый foreign key добавляется ещё и простой индекс на поле... по скорости выборки тоже весьма забавный результат (выборка данных на 100 юзверей, замерять одного не вижу смысла): вариант1 при простой выборке (в столбик) дал 200мсек - 1800 строк - 2 джойна (юзвери - связь - имена_фич) он же, но с группировкой по иду юзверя всех фич в текст - дал 50мсек. - 100 строк (те же 2 джойна с группировкой) вариант2 дает выборку за 44мсек. - 100строк итого в1 "в столбик" проигрывает в 4 раза получается только из-за количества возвращаемых строк, независимо от размера строки. ?!? malloc() в цикле подготовки результата выборки ??? а выделять память под пачку строк сразу - никак? фи... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2012, 22:18 |
|
||
|
Создание связи между двумя сущностями
|
|||
|---|---|---|---|
|
#18+
пардон, там ошибочка есть: 95 метров на 2 700 018 связей... то есть создано 150001 юзверь, каждый из которых связан с 18фичами... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2012, 22:20 |
|
||
|
Создание связи между двумя сущностями
|
|||
|---|---|---|---|
|
#18+
Arhat109У-у-у как всё запущено... :) Монстры, артефакты, ачивки и прочие сущности, по-хорошему надо моделировать собственными таблицами-справочниками, пардон в терминах РМД "отношениями". И делать отдельно связи с игроком, (пардон опять же "отношения" - таблицы) в части "какой_игрок - какая-сущность - сколько_создал - когда_создал - как создал - сколько_убил - когда_убил - как_убил"... ну или допустить что сколько > 0 -- стало быть создал, а ежели меньше, то убил... а не лепить всё в одну таблицу связи, пардон "отношение"... :) Может я что то не правильно понял, но на данный момент схема такая: 1) Есть набор сущностей, каждая сущность ограниченное множество. Например, юниты, их 16 штук, они все в отдельной таблице с 16 записями. У каждого юнита есть свой ИД и только присущий ему набор свойств (здоровье, атака, защита и так далее). 2) Есть таблица юзеров, в которой свойства присущие только юзерам и разумеется ИД. 3) Есть таблица связей каждой сущности и каждого юзера, например "уничтоженные юниты". Вот именно о схеме таких таблиц я и задал изначальный вопрос, возможно несколько размыто и не точно, сорри. Или же вы предлагаете сделать вообще одну таблицу на связь всех сущностей? То есть ид_юнита, тип_сущности, ид_сущности, количество? Где тип сущности может быть совершенно любой? То есть от созданных юнитов, до открытых ачивок (всего их 12 штук)? MasterZivЭто всё не проблема. Запросы будут быстрыми как на чтение, так и на изменение, при условии, что везде будет фильтр по одному игроку. А он тут есть. Я думаю, ты ошибаешься. Поясни, какие UPDATE-ы будут происходить в несколько раз медленнее ? Вы совершенно правы, скорость обновления для одной записи (where id_user = N) примерно одинакова при первом и втором варианте построения таблиц. Но проблема в том, что за один раз (за один вызов скрипта) нужно апдейтить разное количество записей, от 0 до полного обновления всего. Следовательно в первом варианте мне нужно сделать множество запросов на апдейт, что суммарно даст большее время, чем один апдейт на одну сущность при втором варианте. Собственно я это уже проверил экспериментально, разница до 10 раз по суммарному времени апдейта. В игре будут происходить регулярно бои, которые генерируют множество данных для одного или двух игроков, потом все эти данные уходят на сервер, где их надо обработать и расфосовать по таблицам. Собственно это самый нагруженный участок, который задействует все сущности за один раз. Пример - игрок после боя убил 5 видов разных юнитов, мне нужно сделать 5 апдейтов, что бы увеличить его счетчики этих юнитов при первом варианте, против одного апдейта во втором варианте. Arhat109проверил Спасибо! Все примерно так же. И все же получается второй вариант в целом более производительный, чем первый и имеет некое право на существование? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 14:39 |
|
||
|
Создание связи между двумя сущностями
|
|||
|---|---|---|---|
|
#18+
ewb, конечно имеет. Впрочем как и третий... :) У вас больше проблема с пониманием проектирования БД в целом, чем со способом хранения (1,2 или 3). Это сложнее чем Вы себе сейчас понимаете... я бы посоветовал, отойти слегка от задачи и почитать литературу какую-нибудь (тут рядом топик есть). Дело в том, что нагенерить таблиц несложно хоть какой структуры... но потом вокруг них придется писать код... и он может оказаться сильно разным. В целом, имхо, но каждая задача должна слегка "вылежаться" в голове проектировщика. Не стоит тупо торопиться. Это так, рекомендации от человека проектировавшего игрухи военного жанра... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 19:04 |
|
||
|
Создание связи между двумя сущностями
|
|||
|---|---|---|---|
|
#18+
Arhat109ewb, конечно имеет. Впрочем как и третий... :) У вас больше проблема с пониманием проектирования БД в целом, чем со способом хранения (1,2 или 3). Это сложнее чем Вы себе сейчас понимаете... я бы посоветовал, отойти слегка от задачи и почитать литературу какую-нибудь (тут рядом топик есть). Дело в том, что нагенерить таблиц несложно хоть какой структуры... но потом вокруг них придется писать код... и он может оказаться сильно разным. В целом, имхо, но каждая задача должна слегка "вылежаться" в голове проектировщика. Не стоит тупо торопиться. Это так, рекомендации от человека проектировавшего игрухи военного жанра... :) Благодарю за помощь! Так и сделаю. В соседний топик уже заглянул:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 19:46 |
|
||
|
|

start [/forum/topic.php?fid=32&startmsg=37992517&tid=1541509]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
164ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 257ms |
| total: | 483ms |

| 0 / 0 |
