[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как хранить балансы пользователя
123456
Подобный вопрос уже задавался месяца эдак два назад... В нем я видимо не верно выразил поставленную цель... Попробую еще раз...

Есть таблица пользователей.
Есть таблица описания балансов.
Есть таблица объединяющая первую и вторую таблицу, т.е. в третьей таблице хранится информация по балансам пользователей.


Приведу пример первых двух таблиц:

user

id | login | password
--------------------------
1 | 123456 | 123456


cur

id | tag
-------------
1 | RUR
2 | UAH
3 | USD


Теперь собственно вопрос. Как организовать третью таблицу???

Думал сделать такого вида(По-моему надо делать так!):

id - AI
id_user - id пользователя
id_cur - id валюты из второй таблицы
num - количество указанной валюты у указанного пользователя


НО! Есть еще 1 вариант!

id - AI
id_user - id пользователя
p1 - в этом столбце хранится информация по валюте #1
p2 - в этом столбце хранится информация по валюте #2
p3 - в этом столбце хранится информация по валюте #3
при добавлении валюты во второй таблице, триггером добавляем соответствующий столбец в данную таблицу.

Я понимаю, что второй вариант не совсем правильный, но дело в том, что валют может быть и 50 для каждого игрока!


к примеру берем 100.000 игроков! Для каждого игрока по 50 балансов. Итого 5.000.000 записей... Делать выборку будет не так просто!

Если использовать второй вариант, то все проще...


sergeiss
Опять же встречный вопрос...

Ты будешь как делать выборку по валютам? Ну, то есть, будет ли она как-то участвовать в условии WHERE, в группировке или еще где? Или ты будешь просто выбирать эти данные, а условия и группировки будут по другим параметрам?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
123456
Цитата
Ты будешь как делать выборку по валютам?

если смотреть второй вариант(где все валюты в одной записи), то я планирую создавать столбцы не как я указал p1,p2,..pn, а указывать название id из таблицы валют.

Допустим надо проверить, или достаточно валюты для совершения покупки чего-либо.

Делаем все обычным запросом:

SELECT COUNT(*) FROM cur_user WHERE <id_валюты> = <значение> AND<id_валюты> = <значение> AND<id_валюты> = <значение>;

Если найдена строка, то валюты хватает...

Вносим изменения таким же образом...


123456
а таблица с описанием валют в основном хранится для администратора!
Чтоб было видно, какие имеются валюты! И чтоб проще было добавлять и удалять валюты(триггером добавляем столбец в таблицы при добавлении новой валюты)
123456
А если рассматривать первый мною предложенный вариант, то с ним будет уже посложнее.
Уже простым запросом не отделаешься! Даже для проверки наличия определенного количества средств(на нескольких балансах одновременно), изменения балансов и т.д. надо делать более замудренные запросы.

Не говоря уже о размерах таблицы!
Razzwan
Первый вариант проще и логичнее. Валюта может быть, а может и не быть. Кроме того, как ты сам сказал, это соотвествует правилам. Сомневаюсь, что будет большое количество пользователей, у которых будет больше 4х валют. У подавляющего большинства будет не больше 3х. Так что аргумент с большим количеством валют не катит. Все равно первый вариант таблицы будет в итоге иметь меньше ячеек памяти.

_____________
Youtube канал WebDeveloper->Run()
Сайт для души
Gitter
sergeiss
При таком подходе используй "вариант 1". Не такие и замудреные будут запросы smile.gif
Скорее всего, тут также тебе помогут партиции. Хотя, конечно, для оценки пользы партиций надо лучше знать, что у тебя за алгоритм будет, какие запросы будут преобладать. Потому что партиции не панацея, а определенный инструмент для оптимизации БД. И как любой инструмент их надо правильно использовать.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
123456
Razzwan
Валюты будут не RUR, UAH, USD, а игровые(кирпичи, доска, уголь, камни, и.т.д.)
По этому почти у каждого игрока будет 15-20 валют(сразу при регистрации дается 5-10 валют)


sergeiss
вот наверное все запросы, которые будут выполняться для данной таблицы:
1. Выборка всех валют для определенного пользователя (Это 70-80% от всех запросов к данной таблице)
2. Добавление записей (5%)
3. Изменение сразу нескольких записей для определенного пользователя(20%)
В принципе и все...


123456
Запустил такой тест:

В таблице записей > 7.000.000
индекс по id_user

$num = 100000;

$s = microtime(true);

for ($i = 0; $i < $num; $i++)
$sql = DB::q("SELECT * FROM `vs_balance` WHERE `id_user` = ". $i ." AND num > 20");

echo (microtime(true) - $s) / $num;


Результат:
0.000285390150547

На ноуте
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.