Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Структура таблиц
 
 автор: serjinio   (11.09.2009 в 02:29)   письмо автору
 
 

есть объекты и их свойства притом свойства и их количество у каждого объекта разное и каждое имеет своё значение типа :
"окружность" --> радиус (значение) ,диаметр (значение) ,центр(значение)....
"треугольник"-- >катет(значение) , гипотенуза(значение) ,углы(значение)...
"прямоугольник"-->диагональ(значение) ,сторона (значение)....


Какой должна быть структура таблиц,учитывая, что объекты могут добавляться и естественно со своими свойствами и значениями этих свойств?

  Ответить  
 
 автор: cheops   (11.09.2009 в 13:00)   письмо автору
 
   для: serjinio   (11.09.2009 в 02:29)
 

Одной таблицей не обойтись... либо для каждого типа заводить отдельную таблицу, где складировать его уникальные параметры, отличные от параметров остальных объектов. Либо заводить таблицу свойств, где складировать все параметры объектов по схеме "ключ-значение" и связывать её с объектом специальной таблицей - где объекту будут сопоставляться записи из общей таблице параметров.

  Ответить  
 
 автор: serjinio   (11.09.2009 в 14:25)   письмо автору
 
   для: cheops   (11.09.2009 в 13:00)
 

Что-то очень смутно представляю эту структуру для конкретного примера ,если можно, хотя-бы схематически подскажите как правильно организовать.

  Ответить  
 
 автор: heed   (11.09.2009 в 19:12)   письмо автору
 
   для: serjinio   (11.09.2009 в 14:25)
 

при например такой структуре
CREATE TABLE n_item (
  id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  name TINYTEXT NOT NULL,
PRIMARY KEY(id)
) ENGINE=MyISAM;
INSERT INTO n_item (name) VALUES
('окружность'),
('треугольник'),
('прямоугольник');

CREATE TABLE n_kind (
  id    TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
  i_id SMALLINT UNSIGNED NOT NULL,
  name TINYTEXT NOT NULL,
PRIMARY KEY(id)
) ENGINE=MyISAM;
INSERT INTO n_kind (i_id, name) VALUES
(1, 'радиус'),
(1, 'диаметр'),
(1, 'центр'),
(2, 'катет'),
(2, 'гипотенуза'),
(2, 'углы'),
(3, 'диагональ'),
(3, 'сторона');

CREATE TABLE params (
  id   INT UNSIGNED NOT NULL AUTO_INCREMENT,
  i_id SMALLINT UNSIGNED NOT NULL,
  k_id TINYINT UNSIGNED NOT NULL,
  val TINYTEXT NOT NULL,
PRIMARY KEY(id)
) ENGINE=MyISAM;
INSERT INTO params (i_id, k_id, val) VALUES
(1, 1, '12mm'),
(1, 2, '24mm'),
(1, 3, '55x22'),
(2, 4, 'w'),
(2, 5, 'z'),
(2, 6, '45x45x90'),
(3, 8, 'x'),
(3, 7, 'y');


выбрать сразу всё можно будет только наподобии как при GROUP BY
имени параметра, владельцу параметра
SELECT i.*, k.name, p.val
  FROM n_item i
  LEFT JOIN n_kind k
ON k.i_id = i.id
  LEFT JOIN params p
ON p.k_id=k.id
WHERE 1;


или придётся объединять результаты, чтобы не было лишних данных
SELECT i.*, GROUP_CONCAT(CONCAT(k.name, '==', p.val, ' ')) AS val
  FROM n_item i
  LEFT JOIN n_kind k
ON k.i_id = i.id
  LEFT JOIN params p
ON p.k_id=k.id
GROUP BY 1
WHERE 1;

  Ответить  
 
 автор: Trianon   (11.09.2009 в 20:40)   письмо автору
 
   для: heed   (11.09.2009 в 19:12)
 

начали за здравие - кончили за упокой.
я имею в виду эти 24mm, 55x22, 45x45x90

  Ответить  
 
 автор: heed   (11.09.2009 в 23:38)   письмо автору
 
   для: Trianon   (11.09.2009 в 20:40)
 

так не понятно-же какие там данные ,если углы это углы в градусах минутах и секундах ,
то придётся для треугольника делать 9 полей только на углы., или в datetime впихивать ,)
А вдруг ещё двадцатиугольники надо будет вставить ,) и там стороны на в милиметрах , а в космических расстояниях , как-бы хватило-бы bigtext'a :)

  Ответить  
 
 автор: Trianon   (12.09.2009 в 00:03)   письмо автору
 
   для: heed   (11.09.2009 в 23:38)
 

понятно другое.
У каждой фигуры может быть разное количество свойств.
А угол меряется в радианах, точно также, как температура - в кельвинах,
(хотя ничто не мешает и то и другое мерять в градусах, если спичит,)
но уж всяко не в градусах, минутах и секундах.


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

  Ответить  
 
 автор: ride   (11.09.2009 в 23:37)   письмо автору
 
   для: heed   (11.09.2009 в 19:12)
 


//
CREATE TABLE n_kind (
  id    TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
  i_id SMALLINT UNSIGNED NOT NULL,
  name TINYTEXT NOT NULL,
PRIMARY KEY(id)
) ENGINE=MyISAM;  


при данной структуре разве есть смысл в третьей таблице?
не лучше во вторую добавить поле val?

  Ответить  
 
 автор: heed   (11.09.2009 в 23:44)   письмо автору
 
   для: ride   (11.09.2009 в 23:37)
 

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

  Ответить  
 
 автор: ride   (11.09.2009 в 23:49)   письмо автору
 
   для: heed   (11.09.2009 в 23:44)
 

.

  Ответить  
 
 автор: heed   (12.09.2009 в 00:46)   письмо автору
 
   для: ride   (11.09.2009 в 23:49)
 

а да, точно

(1, 'радиус'),
(1, 'диаметр'),
(1, 'центр'),
(2, 'катет'),
(2, 'гипотенуза'),
(2, 'углы'),
(3, 'диагональ'),
(3, 'сторона');

Вторая таблица должна быть независима от первой

т.е во второй таблице не должно быть i_id
спасибо что заметили

// UPD , тогда те запросы будут выглядеть так
SELECT i.*, k.name, p.val
  FROM n_item i
  LEFT JOIN params p
ON p.i_id=i.id
  LEFT JOIN n_kind k
ON k.id = p.k_id
WHERE 1;

SELECT i.*, GROUP_CONCAT(CONCAT(k.name, '==', p.val, ' ')) AS val
  FROM n_item i
  LEFT JOIN params p
ON p.i_id=i.id
  LEFT JOIN n_kind k
ON k.id = p.k_id
GROUP BY 1

  Ответить  
 
 автор: serjinio   (12.09.2009 в 13:40)   письмо автору
 
   для: heed   (12.09.2009 в 00:46)
 

А, будьте добры, объясните для чего нужен GROUP_CONCAT(CONCAT(k.name, '==', p.val, ' ')) AS val

  Ответить  
 
 автор: heed   (12.09.2009 в 15:44)   письмо автору
 
   для: serjinio   (12.09.2009 в 13:40)
 

кагбы это объЯснить ,)
я не знаю как правильнее будет перевести строчки
This function returns a string result with the concatenated non-NULL
values from a group. It returns NULL if there are no non-NULL values.

, которые во встроенной справке mysql
mysql> HELP GROUP_CONCAT
Name: 'GROUP_CONCAT'
Description:
Syntax:
GROUP_CONCAT(expr)

This function returns a string result with the concatenated non-NULL
values from a group. It returns NULL if there are no non-NULL values.
The full syntax is as follows:

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

URL: http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html

Examples:
mysql> SELECT student_name,
    ->     GROUP_CONCAT(test_score)
    ->     FROM student
    ->     GROUP BY student_name;

mysql>

  Ответить  
 
 автор: serjinio   (12.09.2009 в 15:54)   письмо автору
 
   для: heed   (12.09.2009 в 15:44)
 

спасибо ,понял смысл конструкции.

  Ответить  
 
 автор: Trianon   (12.09.2009 в 15:56)   письмо автору
 
   для: heed   (12.09.2009 в 15:44)
 

Функция возвращает в качестве результата строку, представляющую сцепленные существующие значения из группы. Либо NULL , если ни одного (не NULL) значения не нашлось.

  Ответить  
 
 автор: Mookapek   (11.09.2009 в 22:15)   письмо автору
 
   для: cheops   (11.09.2009 в 13:00)
 

А какого типа будет поле "значение" из приведенной вами схемы?

  Ответить  
 
 автор: Trianon   (11.09.2009 в 22:44)   письмо автору
 
   для: Mookapek   (11.09.2009 в 22:15)
 

cheops схему-то не привел.
Какое сделаете - такое и будет.
Можете даже все нужные сделать.

  Ответить  
 
 автор: Mookapek   (11.09.2009 в 22:56)   письмо автору
 
   для: Trianon   (11.09.2009 в 22:44)
 

Хорошо, сформулирую по другому: какого типа будет поле "значение", если сделать схему согласно вашему описанию?

  Ответить  
 
 автор: Mookapek   (11.09.2009 в 22:59)   письмо автору
 
   для: Trianon   (11.09.2009 в 22:44)
 

Какое сделаете - такое и будет.
То есть сделаю TEXT и буду туда записывать диаметр, допустим, да?
Я к тому, что как можно сделать одно поле "значения" для множества атрибутов, одни из которых содержат числовые значения, а другие - текст.

  Ответить  
 
 автор: Trianon   (11.09.2009 в 23:03)   письмо автору
 
   для: Mookapek   (11.09.2009 в 22:59)
 

по-моему, поле TEXT не самое удачное.
Тогда уж VARCHAR. Хотя...

сделайте несколько опциональных полей и выбирайте их через COALESCE
http://softtime.ru/forum/read.php?id_forum=3&id_theme=28253

  Ответить  
 
 автор: ride   (12.09.2009 в 00:33)   письмо автору
 
   для: Mookapek   (11.09.2009 в 22:59)
 

это будет зависеть от задачи.
вполне возможно, что поле "значение" будет числовым и добавиться поле для указания ед измерения.

  Ответить  
 
 автор: Trianon   (12.09.2009 в 00:46)   письмо автору
 
   для: ride   (12.09.2009 в 00:33)
 

куда более вероятно, что поле для указания ед измерения просто не понадобится.

  Ответить  
 
 автор: Trianon   (12.09.2009 в 00:54)   письмо автору
 
   для: Mookapek   (11.09.2009 в 22:15)
 

вот, кстати, нашел один из своих примеров аналогов возможных схем
http://softtime.ru/forum/read.php?id_forum=3&id_theme=58335

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования