123456
25.07.2015 - 22:40
Подобный вопрос уже задавался месяца эдак два назад... В нем я видимо не верно выразил поставленную цель... Попробую еще раз...
Есть таблица пользователей.
Есть таблица описания балансов.
Есть таблица объединяющая первую и вторую таблицу, т.е. в третьей таблице хранится информация по балансам пользователей.
Приведу пример первых двух таблиц:
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
25.07.2015 - 22:52
Опять же встречный вопрос...
Ты будешь как делать выборку по валютам? Ну, то есть, будет ли она как-то участвовать в условии WHERE, в группировке или еще где? Или ты будешь просто выбирать эти данные, а условия и группировки будут по другим параметрам?
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
123456
25.07.2015 - 23:42
Цитата |
Ты будешь как делать выборку по валютам? |
если смотреть второй вариант(где все валюты в одной записи), то я планирую создавать столбцы не как я указал p1,p2,..pn, а указывать название id из таблицы валют.
Допустим надо проверить, или достаточно валюты для совершения покупки чего-либо.
Делаем все обычным запросом:
SELECT COUNT(*) FROM cur_user WHERE <id_валюты> = <значение> AND<id_валюты> = <значение> AND<id_валюты> = <значение>;
Если найдена строка, то валюты хватает...
Вносим изменения таким же образом...
123456
25.07.2015 - 23:44
а таблица с описанием валют в основном хранится для администратора!
Чтоб было видно, какие имеются валюты! И чтоб проще было добавлять и удалять валюты(триггером добавляем столбец в таблицы при добавлении новой валюты)
123456
25.07.2015 - 23:47
А если рассматривать первый мною предложенный вариант, то с ним будет уже посложнее.
Уже простым запросом не отделаешься! Даже для проверки наличия определенного количества средств(на нескольких балансах одновременно), изменения балансов и т.д. надо делать более замудренные запросы.
Не говоря уже о размерах таблицы!
Razzwan
26.07.2015 - 00:01
Первый вариант проще и логичнее. Валюта может быть, а может и не быть. Кроме того, как ты сам сказал, это соотвествует правилам. Сомневаюсь, что будет большое количество пользователей, у которых будет больше 4х валют. У подавляющего большинства будет не больше 3х. Так что аргумент с большим количеством валют не катит. Все равно первый вариант таблицы будет в итоге иметь меньше ячеек памяти.
_____________
Youtube канал WebDeveloper->Run()Сайт для душиGitter
sergeiss
26.07.2015 - 00:04
При таком подходе используй "вариант 1". Не такие и замудреные будут запросы

Скорее всего, тут также тебе помогут партиции. Хотя, конечно, для оценки пользы партиций надо лучше знать, что у тебя за алгоритм будет, какие запросы будут преобладать. Потому что партиции не панацея, а определенный инструмент для оптимизации БД. И как любой инструмент их надо правильно использовать.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
123456
26.07.2015 - 00:23
Razzwan
Валюты будут не RUR, UAH, USD, а игровые(кирпичи, доска, уголь, камни, и.т.д.)
По этому почти у каждого игрока будет 15-20 валют(сразу при регистрации дается 5-10 валют)
sergeiss
вот наверное все запросы, которые будут выполняться для данной таблицы:
1. Выборка всех валют для определенного пользователя (Это 70-80% от всех запросов к данной таблице)
2. Добавление записей (5%)
3. Изменение сразу нескольких записей для определенного пользователя(20%)
В принципе и все...
123456
26.07.2015 - 00:33
Запустил такой тест:
В таблице записей > 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
На ноуте
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.