|
|
|
| есть объекты и их свойства притом свойства и их количество у каждого объекта разное и каждое имеет своё значение типа :
"окружность" --> радиус (значение) ,диаметр (значение) ,центр(значение)....
"треугольник"-- >катет(значение) , гипотенуза(значение) ,углы(значение)...
"прямоугольник"-->диагональ(значение) ,сторона (значение)....
|
Какой должна быть структура таблиц,учитывая, что объекты могут добавляться и естественно со своими свойствами и значениями этих свойств? | |
|
|
|
|
|
|
|
для: serjinio
(11.09.2009 в 02:29)
| | Одной таблицей не обойтись... либо для каждого типа заводить отдельную таблицу, где складировать его уникальные параметры, отличные от параметров остальных объектов. Либо заводить таблицу свойств, где складировать все параметры объектов по схеме "ключ-значение" и связывать её с объектом специальной таблицей - где объекту будут сопоставляться записи из общей таблице параметров. | |
|
|
|
|
|
|
|
для: cheops
(11.09.2009 в 13:00)
| | Что-то очень смутно представляю эту структуру для конкретного примера ,если можно, хотя-бы схематически подскажите как правильно организовать. | |
|
|
|
|
|
|
|
для: 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;
|
| |
|
|
|
|
|
|
|
для: heed
(11.09.2009 в 19:12)
| | начали за здравие - кончили за упокой.
я имею в виду эти 24mm, 55x22, 45x45x90 | |
|
|
|
|
|
|
|
для: Trianon
(11.09.2009 в 20:40)
| | так не понятно-же какие там данные ,если углы это углы в градусах минутах и секундах ,
то придётся для треугольника делать 9 полей только на углы., или в datetime впихивать ,)
А вдруг ещё двадцатиугольники надо будет вставить ,) и там стороны на в милиметрах , а в космических расстояниях , как-бы хватило-бы bigtext'a :) | |
|
|
|
|
|
|
|
для: heed
(11.09.2009 в 23:38)
| | понятно другое.
У каждой фигуры может быть разное количество свойств.
А угол меряется в радианах, точно также, как температура - в кельвинах,
(хотя ничто не мешает и то и другое мерять в градусах, если спичит,)
но уж всяко не в градусах, минутах и секундах.
Двадцатиугольник, если он правильный и выпуклый, описывается двумя величинами.
А если нет - то это полигон - описывается списком вершин. | |
|
|
|
|
|
|
|
для: 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? | |
|
|
|
|
|
|
|
для: ride
(11.09.2009 в 23:37)
| | кагбы всё обычно делается для уменьшения дублирования названий , например как здесь радиус , диаметр .......
поэтому у первичного ключа второй таблицы сделал самые короткие цифры
, там должно быть меньше всего данных
. Но я просто предложил один из возможных вариантов , хотя наверное и правда слишком расплывчато что именно упаковывается в такую структуру | |
|
|
|
|
|
|
|
для: heed
(11.09.2009 в 23:44)
| | . | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: heed
(12.09.2009 в 00:46)
| | А, будьте добры, объясните для чего нужен GROUP_CONCAT(CONCAT(k.name, '==', p.val, ' ')) AS val | |
|
|
|
|
|
|
|
для: 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>
|
| |
|
|
|
|
|
|
|
для: heed
(12.09.2009 в 15:44)
| | спасибо ,понял смысл конструкции. | |
|
|
|
|
|
|
|
для: heed
(12.09.2009 в 15:44)
| | Функция возвращает в качестве результата строку, представляющую сцепленные существующие значения из группы. Либо NULL , если ни одного (не NULL) значения не нашлось. | |
|
|
|
|
|
|
|
для: cheops
(11.09.2009 в 13:00)
| | А какого типа будет поле "значение" из приведенной вами схемы? | |
|
|
|
|
|
|
|
для: Mookapek
(11.09.2009 в 22:15)
| | cheops схему-то не привел.
Какое сделаете - такое и будет.
Можете даже все нужные сделать. | |
|
|
|
|
|
|
|
для: Trianon
(11.09.2009 в 22:44)
| | Хорошо, сформулирую по другому: какого типа будет поле "значение", если сделать схему согласно вашему описанию? | |
|
|
|
|
|
|
|
для: Trianon
(11.09.2009 в 22:44)
| | Какое сделаете - такое и будет.
То есть сделаю TEXT и буду туда записывать диаметр, допустим, да?
Я к тому, что как можно сделать одно поле "значения" для множества атрибутов, одни из которых содержат числовые значения, а другие - текст. | |
|
|
|
|
|
|
|
для: Mookapek
(11.09.2009 в 22:59)
| | по-моему, поле TEXT не самое удачное.
Тогда уж VARCHAR. Хотя...
сделайте несколько опциональных полей и выбирайте их через COALESCE
http://softtime.ru/forum/read.php?id_forum=3&id_theme=28253 | |
|
|
|
|
|
|
|
для: Mookapek
(11.09.2009 в 22:59)
| | это будет зависеть от задачи.
вполне возможно, что поле "значение" будет числовым и добавиться поле для указания ед измерения. | |
|
|
|
|
|
|
|
для: ride
(12.09.2009 в 00:33)
| | куда более вероятно, что поле для указания ед измерения просто не понадобится. | |
|
|
|
|
|
|
|
для: Mookapek
(11.09.2009 в 22:15)
| | вот, кстати, нашел один из своих примеров аналогов возможных схем
http://softtime.ru/forum/read.php?id_forum=3&id_theme=58335 | |
|
|
|
|