|
|
|
| Посоветуйте как лучше организовать таблицу, нужно в таблице хранить около 200 параметров для каждого пользователя. Самый простой вариант это создать 200 с лишним колонок, но мне кажется это не рационально. Причем значения параметров это 1 или 0, т.е. используется параметр или нет.
Например
id | count | m1 | m2 | ... | m200
1 | 23 | 1 | 0 | ... | 1
2 | 0 | 0 | 0 | ... | 1
Второй вариант это используемые параметры загнать в строку
Например
id | count | parameters
1 | 4 | 1,45,23,35,76,99,101,123,
2 | 98 | all
3 | 0 | 98,7,65,67,99,200,
и с помощью LIKE выбирать пользователя, у которого есть тот или иной параметр | |
|
|
|
|
|
|
|
для: Gendalf
(23.11.2007 в 17:46)
| | если значения могут быть 1 или 0 то каждая комбинация параметров это двоичное число.
При установке параметров юзера переводим его в десятичное и сохраняем в одно поле.
пр выборке результата комбинация параметров опять же двоичное число, переводим в десятичное и ищем в базе.
скорость гораздо выше получится, однако :)
PS в порядке бреда, так как не знаю условий задачи
PPS а на самом деле, нафига 200 параметров? Подозреваю что оптимизировать надо не базу, а реализацию... | |
|
|
|
|
|
|
|
для: Axxil
(23.11.2007 в 22:28)
| | >если значения могут быть 1 или 0 то каждая комбинация параметров это двоичное число.
>При установке параметров юзера переводим его в десятичное и сохраняем в одно поле.
>пр выборке результата комбинация параметров опять же двоичное число, переводим в десятичное и ищем в базе.
>скорость гораздо выше получится, однако :)
чет не понял как искать в базе, можно пример. Да и ктому же 2 в двухсотой степени это огромное число.
>PS в порядке бреда, так как не знаю условий задачи
>
>PPS а на самом деле, нафига 200 параметров? Подозреваю что оптимизировать надо не базу, а реализацию...
задача примерно такая:
нужно выбрать рандомно одного пользователя, в зависимости того или параметра. | |
|
|
|
|
|
|
|
для: Gendalf
(24.11.2007 в 16:30)
| | > 2 в 200 степени
да, не подумал. Перевод в десятичный формат тут не нужен.
Значит просто храните конфигурацию параметров в виде строки 0 и 1
и соответственно так и ищете пользователя.
Формируете строку параметров. Если параметр true то 1 если false то 0. Так выставляете все параметры. Получаете примерно следующее
<?
$flags = '0000100100...01';
$sql = 'SELECT * FROM users WHERE flags=\''.$flags.'\'';
?>
|
По-моему самое оптимальное. И городить 200-колоночную таблицу смысла нет никакого. | |
|
|
|
|
|
|
|
для: Axxil
(25.11.2007 в 14:42)
| | мне нужно искать не по всем параметрам, а только по одному. Т.е. у кого выбран допустим параметр м22 | |
|
|
|
|
|
|
|
для: Gendalf
(25.11.2007 в 15:17)
| | Тогдп можно определять значение параметра c номером 22 с помощью функции SUBSTRING
<?
$flags = '0000100100...01';
$sql = 'SELECT * FROM users WHERE SUBSTRING(flags,22,1)=1';
?>
|
| |
|
|
|
|
|
|
|
для: Axxil
(25.11.2007 в 17:33)
| | Так тоже думал сделать, но не будет ли большой нагрузки?
Записей в бд будет около 20 тысяч | |
|
|
|
|
|
|
|
для: Gendalf
(25.11.2007 в 19:38)
| | 20000 записей, это ерунда для БД.
Предлагаю не парится, а реализовать.
Когда пойдут проблемы с падением базы, тогда и будете придумывать обходные манёвры.
Какая нагрузка (в хитах или запросах/минуту) предполагается? | |
|
|
|
|
|
|
|
для: Axxil
(26.11.2007 в 09:14)
| | думаю максимум 10 000 хитов в сутки | |
|
|
|
|
|
|
|
для: Gendalf
(27.11.2007 в 16:19)
| | Спите спокойно. База должна справиться. | |
|
|
|
|
|
|
|
|
для: Gendalf
(23.11.2007 в 17:46)
| | скорее всего будет рациональнее, хранить пользователей в одной таблице, а параметры в другой, связанной между собой. | |
|
|
|
|
|
|
|
для: Faraon
(25.11.2007 в 02:09)
| | т.е. создать отдельную таблицу с двухстами колонками? | |
|
|
|