Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Структуры данных / 6 сообщений из 6, страница 1 из 1
19.05.2006, 23:09
    #33739952
eudo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры данных
Доброго времени суток.

Есть три вида сущьности, которые необходимо хранить. В первой - 10 полей, во второй - 20 полей в третьей - 30 полей. Поля, например текстовые. У всех сущьностей должна быть сквозная нумерация. Какая структура таблиц будет правильная и оптимальная?

Я представлял такие структуры таблиц:

CREATE TABLE data_1 (
id int(11) NOT NULL auto_increment,
header_id int(11) unsigned DEFAULT '0' NOT NULL,
field1 varchar(100) NOT NULL,
...
field10 varchar(100) NOT NULL,
PRIMARY KEY (id)
);

CREATE TABLE data_2 (
id int(11) NOT NULL auto_increment,
header_id int(11) unsigned DEFAULT '0' NOT NULL,
field1 varchar(100) NOT NULL,
...
field20 varchar(100) NOT NULL,
PRIMARY KEY (id)
);

CREATE TABLE data_3 (
id int(11) NOT NULL auto_increment,
header_id int(11) unsigned DEFAULT '0' NOT NULL,
field1 varchar(100) NOT NULL,
...
field30 varchar(100) NOT NULL,
PRIMARY KEY (id)
);

CREATE TABLE headers (
id int(11) NOT NULL auto_increment,
data_id int(11) unsigned DEFAULT '0' NOT NULL,
type_id int(11) unsigned DEFAULT '0' NOT NULL,
...
PRIMARY KEY (id),
KEY data_id (data_id)
);

CREATE TABLE types (
id int(11) NOT NULL auto_increment,
table_name varchar(50) NOT NULL,
....
PRIMARY KEY (id)
);

INSERT INTO types VALUES ( '1', 'data_1', 'Сущьность 1');
INSERT INTO types VALUES ( '2', 'data_2', 'Сущьность 2');
INSERT INTO types VALUES ( '3', 'data_3', 'Сущьность 3');

---

data_1, data_2, data_3 - таблицы для хранение тел сущьностей (их полей)

headers - таблица хранящая заголовки сущьности, id (сквозная нумерация), type_id - вид сущьности, дата добавления, изменения и пр.

В types хранятся данные о сущьностях, в каких таблицах хранятся тела заголовков и пр.

Теперь по функциональности. Добавление, удаление поиск в пределах одной сущьности не проблема, LEFT JOIN например.

Проблемы возникают при формировании результата поиска по всем сущьностям. Например, нужно получить 30 последних добавленных сущьностей, с телами.

Для этого потребуется 3 запроса

select headers.*,data_1.* from data_1 LEFT JOIN headers ON headers.data_id=data_1.id WHERE data_1.field1 like '%some text%' ORDER BY headers.id DESC LIMIT 0,30

select headers.*,data_2.* from data_2 LEFT JOIN headers ON headers.data_id=data_2.id WHERE data_2.field1 like '%some text%' ORDER BY headers.id DESC LIMIT 0,30

select headers.*,data_3.* from data_3 LEFT JOIN headers ON headers.data_id=data_3.id WHERE data_3.field1 like '%some text%' ORDER BY headers.id DESC LIMIT 0,30

Результирующие наборы объединяем в массив, на каком-то языке программирования, сортируем по headers.id, и берем первые 30 элементов. На лицо избыточность при выборках - выбрали 90 элементов. Чем больше видов сущьностей мы имеем - тем большая избыточность при выборках.

Других вариантов придумать не могу, разве что получить сначала список заголовков потом на языке программирования для каждого заголовка писать запрос на вытаскивание его тела (31 запрос выходит). Или как вариант сделать всего одну табличку с 60 полями 8-[... Тогда просто и красиво, кроме самой таблички, и при мысли добавить еще один вид сущьности...

У кого какие мысли по этому поводу? как сделать правильно и красиво?
...
Рейтинг: 0 / 0
20.05.2006, 08:24
    #33740104
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры данных
eudoПроблемы возникают при формировании результата поиска по всем сущьностям. Например, нужно получить 30 последних добавленных сущьностей, с телами.

Для этого потребуется 3 запроса

select headers.*,data_1.* from data_1 LEFT JOIN headers ON headers.data_id=data_1.id WHERE data_1.field1 like '%some text%' ORDER BY headers.id DESC LIMIT 0,30

select headers.*,data_2.* from data_2 LEFT JOIN headers ON headers.data_id=data_2.id WHERE data_2.field1 like '%some text%' ORDER BY headers.id DESC LIMIT 0,30

select headers.*,data_3.* from data_3 LEFT JOIN headers ON headers.data_id=data_3.id WHERE data_3.field1 like '%some text%' ORDER BY headers.id DESC LIMIT 0,30

Результирующие наборы объединяем в массив, на каком-то языке программирования, сортируем по headers.id, и берем первые 30 элементов. На лицо избыточность при выборках - выбрали 90 элементов. Чем больше видов сущьностей мы имеем - тем большая избыточность при выборках.эти три селекта можно объединить в один:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT * FROM 
(
SELECT headers.*,data_3.* FROM data_3 LEFT JOIN headers ON headers.data_id=data_3.id WHERE data_3.field1 like '%some text%' ORDER BY headers.id DESC LIMIT  30 
UNION ALL
SELECT headers.*,data_1.*, NULL, ... , NULL FROM data_1 LEFT JOIN headers ON headers.data_id=data_1.id WHERE data_1.field1 like '%some text%' ORDER BY headers.id DESC LIMIT  30 
UNION ALL
SELECT headers.*,data_2.*, NULL, ... , NULL FROM data_2 LEFT JOIN headers ON headers.data_id=data_2.id WHERE data_2.field1 like '%some text%' ORDER BY headers.id DESC LIMIT  30 
)
ORDER BY headers.id DESC
LIMIT  30 

только какой смысл выдавать одним списком кашу из разных сущностей?
...
Рейтинг: 0 / 0
20.05.2006, 16:41
    #33740414
eudosss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры данных
Например, сущность это объявление, они бывают например о продаже квартир, с указанием площади, кол-ва комнат. Горшков имеющих диаметр и цвет, фотоаппаратов с разным кол-ом мегапикселей и т.д.

Прочитав краем уха форум Проектирование Бд, услышал про модель Тенцора, не понятно только на сколько просто там можно реализовать поиск по полям справочника, и формирования из результата списка? И на сколько оправдано будет его использование при 3-6 справочниках?
...
Рейтинг: 0 / 0
20.05.2006, 21:12
    #33740608
eudo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры данных
Порадовало вот это
http://bugs.mysql.com/bug.php?id=2435
блин :(
...
Рейтинг: 0 / 0
20.05.2006, 21:21
    #33740619
Dinky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры данных
eudoПорадовало вот это
http://bugs.mysql.com/bug.php?id=2435
блин :(
так и что? вроде как пофиксили год назад?
[11 Mar 2005 18:11] Paul DuBois
Noted in 4.1.11 changelog.

--
Dmitry
...
Рейтинг: 0 / 0
20.05.2006, 21:26
    #33740623
eudo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структуры данных
Да, действительно, стратил.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Структуры данных / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]