Задавайте вопросы, мы ответим
Вы не зашли.
Есть проблема, помогите, кто знает: Как хранить в MySql трехмерные массивы?
Всем заранее большое спасибо!
Решил поподробнее описать ситуацию:
массив - $mas[];
Первая размерность массива - это имя пользователя - user
Вторая размерность - это название предмета, который есть у юзера - thing
Третья размерность - это категория, к которой относится предмет - category
И значения элемента $mas['user']['thing']['category'] будет либо 1 либо 0,
Т.е. у конкретного Юзера есть !не одна какая-то вещь!, а есть все вещи, которые доступны на сайте.
Далее: каждая вещь либо относится к определенной категории, либо нет, что и характеризуют 1 и 0.
Поэтому вещь нужно рассматривать также во всем диапазоне категорий.
Вот я так подозреваю и нужно использовать трехмерный массив, но как его хранить в MySql, что-то никак не догоню. У вас опыта поболе будет, может кто знает лекарство?!
Отредактированно Diff (08.02.2008 15:16:09)
Неактивен
Самое простое - делаете таблицу из четырех полей: user, thing, category, value (1,0). Только зачем Вам это?
Обычно правильней хранить данные так, чтобы они отражали суть данных, а не особенности реализации программы. Нужные Вам массивы получите соответствующей выборкой.
Например, у Вас есть три таблицы:
create table `user`(id int, name varchar(255), thing int); -- thing принимает значения 0,1
create table `thing` (id int, title varchar(255), category int); -- category это номер из табл `cat`
create table `cat` (id int, title varchar(255));
Нужную Вам выборку Вы можете получить запросом:
select u.name, t.title, c.title, if(thing.category=cat.id, 1, 0) from `user` u, `thing` t, `cat` c where `user`.`thing`='1';
Неактивен
vasya написал:
Самое простое - делаете таблицу из четырех полей: user, thing, category, value (1,0). Только зачем Вам это?
Обычно правильней хранить данные так, чтобы они отражали суть данных, а не особенности реализации программы. Нужные Вам массивы получите соответствующей выборкой.
Например, у Вас есть три таблицы:
create table `user`(id int, name varchar(255), thing int); -- thing принимает значения 0,1
create table `thing` (id int, title varchar(255), category int); -- category это номер из табл `cat`
create table `cat` (id int, title varchar(255));
Нужную Вам выборку Вы можете получить запросом:
select u.name, t.title, c.title, if(thing.category=cat.id, 1, 0) from `user` u, `thing` t, `cat` c where `user`.`thing`='1';
Вася, большое спасибо, но, похоже, мне нужно объяснить ситуацию ещё подробнее, привожу пример:
* есть пользователь Hacker
* ему предлагают высказать своё мнение по поводу суперновых программ (это типа вещи), которых 4 штуки:
1 Windows
2 Winamp
3 IE 7
4 Notepad
* Их нужно оценить по 4 признакам (это типа категории), по принципу 1-Да, 0-Нет:
1 Легко хакнуть
2 Хоть какую-то пользу она приносит?
3 Устарела
4 Да я сам автор!
Вот и получилась такая хрень:
-Здорово, Hacker >:-| лепим тебе присоски - будешь проходить тест!
Windows:
*Легко хакнуть ----------------------------- 1
*Хоть какую-то пользу она приносит? --- 0
*Устарела ------------------------------------ 1
*Да я сам автор! ----------------------------- нах надо!
Winamp:
*Легко хакнуть ----------------------------- 1
*Хоть какую-то пользу она приносит? --- 1
*Устарела ------------------------------------ 0
*Да я сам автор! ----------------------------- 0
IE 7:
*Легко хакнуть ----------------------------- 1
*Хоть какую-то пользу она приносит? --- 0
*Устарела ------------------------------------ 1
*Да я сам автор! ----------------------------- 0
Notepad:
*Легко хакнуть ----------------------------- 0
*Хоть какую-то пользу она приносит? --- 1
*Устарела ------------------------------------ 0
*Да я сам автор! ----------------------------- 1
- Запускаем следующего... кто у нас.. ага, Lamarёвич! Лепим присоски.... и т.д.
Это, конечно, тупой пример, на самом деле, будет так:
* Юзеров, если повезет, то очень много
* Thing'sов будет около 500 000 шт.
* Категорий около 100 шт.
Причем, количество Юзеров и Предметов и Категорий будет по-чуть-чуть расти.
И как организовать хранение этих данных...
Самое обидное, что решение здесь не мега-сложное, но додуматься сам до него ну никак не могу ((((((
Спасибо, всем Светлым Головам, которые в этом понимают!
Отредактированно Diff (08.02.2008 15:17:15)
Неактивен
Что-то я не понял в чем заключается суть Вашего нынешнего вопроса.
Неактивен
Diff написал:
Это, конечно, тупой пример, на самом деле, будет так:
* Юзеров, если повезет, то очень много
* Thing'sов будет около 500 000 шт.
* Категорий около 100 шт.
Причем, количество Юзеров и Предметов и Категорий будет по-чуть-чуть расти.
И как организовать хранение этих данных...
Как организовать хранение данных зависит от самих данных. Например, в ранее предложенной реализации с тремя таблицами, подразумевается, что каждая вещь может относится ко всем категориям. А если их около 100 штук, то как-то сомнительно, что это так. Ведь не будете же Вы делать тест с указанием ста пунктов для каждой вещи.
Опять же Вам, наверное, ещё нужно хранить результаты тестов и возможно что-то ещё (мы ведь не знаем всей логики приложения).
Напишите на бумаге какие типы данных у Вас есть (пользователи, вещи, категории и т.д.) какими свойствами они обладают, как соотносятся между собой (один к одному/один ко многим/многие ко многим). В соответствии с этим и сможете понять сколько таблиц Вам нужно и что в них хранить.
То что количество Юзеров и Предметов и Категорий будет по-чуть-чуть расти ни на что не влияет. По мере надобности они добавляются в соответствующие таблицы, на логику приложения это не повлияет - запросы ведь не зависят от количества строк в той или иной таблице.
Неактивен
А тупая запись в одну таблицу не годится? Типа
CREATE TABLE answers (userid INT, categoryid INT, thingid INT, answer VARCHAR(10));
Неактивен
vasya написал:
Самое простое - делаете таблицу из четырех полей: user, thing, category, value (1,0). Только зачем Вам это?
Обычно правильней хранить данные так, чтобы они отражали суть данных, а не особенности реализации программы. Нужные Вам массивы получите соответствующей выборкой.
Например, у Вас есть три таблицы:
create table `user`(id int, name varchar(255), thing int); -- thing принимает значения 0,1
create table `thing` (id int, title varchar(255), category int); -- category это номер из табл `cat`
create table `cat` (id int, title varchar(255));
Нужную Вам выборку Вы можете получить запросом:
select u.name, t.title, c.title, if(thing.category=cat.id, 1, 0) from `user` u, `thing` t, `cat` c where `user`.`thing`='1';
Василий, спасибо, похоже, я разобрался - именно этот вариант наиболее мне подходит! Только, что означает конструкция if(thing.category=cat.id, 1, 0) в запросе? Если можно, объясните, пожалуйста. А так, структура, как раз то, что мне нужно.
Неактивен
в запросе IF() функция трех аргументов, если первый аргумент истина - результат функции второй аргумент, впротивном случае - третий аргменент (аналог оператора ?: в С++ и PHP)
mysql> select IF(1, 3, 4); +-------------+ | IF(1, 3, 4) | +-------------+ | 3 | +-------------+ 1 row in set (0.02 sec) mysql> select IF(0, 3, 4); +-------------+ | IF(0, 3, 4) | +-------------+ | 4 | +-------------+ 1 row in set (0.00 sec) mysql> select IF(2+3=4, 3, 4); +-----------------+ | IF(2+3=4, 3, 4) | +-----------------+ | 4 | +-----------------+ 1 row in set (0.00 sec) mysql> select IF(2+3=5, 3, 4); +-----------------+ | IF(2+3=5, 3, 4) | +-----------------+ | 3 | +-----------------+ 1 row in set (0.00 sec)
Неактивен