SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.02.2008 12:54:45

Diff
Участник
Зарегистрирован: 08.02.2008
Сообщений: 3

Как хранить в MySql трехмерные массивы?

Есть проблема, помогите, кто знает: Как хранить в MySql трехмерные массивы?

Всем заранее большое спасибо!

Решил поподробнее описать ситуацию:

массив - $mas[];

Первая размерность массива - это имя пользователя - user
Вторая размерность - это название предмета, который есть у юзера - thing
Третья размерность - это категория, к которой относится предмет - category

И значения элемента $mas['user']['thing']['category'] будет либо 1 либо 0,

Т.е. у конкретного Юзера есть !не одна какая-то вещь!, а есть все вещи, которые доступны на сайте.
Далее: каждая вещь либо относится к определенной категории, либо нет, что и характеризуют 1 и 0.
Поэтому вещь нужно рассматривать также во всем диапазоне категорий.

Вот я так подозреваю и нужно использовать трехмерный массив, но как его хранить в MySql, что-то никак не догоню. У вас опыта поболе будет, может кто знает лекарство?!

Отредактированно Diff (08.02.2008 15:16:09)

Неактивен

 

#2 08.02.2008 14:21:02

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Как хранить в MySql трехмерные массивы?

Самое простое - делаете таблицу из четырех полей: 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';

Неактивен

 

#3 08.02.2008 15:06:51

Diff
Участник
Зарегистрирован: 08.02.2008
Сообщений: 3

Re: Как хранить в MySql трехмерные массивы?

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 шт.

Причем, количество Юзеров и Предметов и Категорий будет по-чуть-чуть расти.

И как организовать хранение этих данных...
Самое обидное, что решение здесь не мега-сложное, но додуматься сам до него ну никак не могу sad((((((
Спасибо, всем Светлым Головам, которые в этом понимают!

Отредактированно Diff (08.02.2008 15:17:15)

Неактивен

 

#4 08.02.2008 15:22:42

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Как хранить в MySql трехмерные массивы?

Что-то я не понял в чем заключается суть Вашего нынешнего вопроса.

Неактивен

 

#5 08.02.2008 15:42:30

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Как хранить в MySql трехмерные массивы?

Diff написал:

Это, конечно, тупой пример, на самом деле, будет так:
* Юзеров, если повезет, то очень много
* Thing'sов будет около 500 000 шт.
* Категорий около 100 шт.

Причем, количество Юзеров и Предметов и Категорий будет по-чуть-чуть расти.

И как организовать хранение этих данных...

Как организовать хранение данных зависит от самих данных. Например, в ранее предложенной реализации с тремя таблицами, подразумевается, что каждая вещь может относится ко всем категориям. А если их около 100 штук, то как-то сомнительно, что это так. Ведь не будете же Вы делать тест с указанием ста пунктов для каждой вещи.
Опять же Вам, наверное, ещё нужно хранить результаты тестов и возможно что-то ещё (мы ведь не знаем всей логики приложения).

Напишите на бумаге какие типы данных у Вас есть (пользователи, вещи, категории и т.д.) какими свойствами они обладают, как соотносятся между собой (один к одному/один ко многим/многие ко многим). В соответствии с этим и сможете понять сколько таблиц Вам нужно и что в них хранить.

То что количество Юзеров и Предметов и Категорий будет по-чуть-чуть расти ни на что не влияет. По мере надобности они добавляются в соответствующие таблицы, на логику приложения это не повлияет - запросы ведь не зависят от количества строк в той или иной таблице.

Неактивен

 

#6 09.02.2008 16:50:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Как хранить в MySql трехмерные массивы?

А тупая запись в одну таблицу не годится? Типа
CREATE TABLE answers (userid INT, categoryid INT, thingid INT, answer VARCHAR(10));

Неактивен

 

#7 11.02.2008 13:56:18

Diff
Участник
Зарегистрирован: 08.02.2008
Сообщений: 3

Re: Как хранить в MySql трехмерные массивы?

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) в запросе? Если можно, объясните, пожалуйста. А так, структура, как раз то, что мне нужно.

Неактивен

 

#8 11.02.2008 14:01:04

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Как хранить в MySql трехмерные массивы?

в запросе 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)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson