powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Структуры данных
6 сообщений из 6, страница 1 из 1
Структуры данных
    #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
Структуры данных
    #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
Структуры данных
    #33740414
eudosss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Например, сущность это объявление, они бывают например о продаже квартир, с указанием площади, кол-ва комнат. Горшков имеющих диаметр и цвет, фотоаппаратов с разным кол-ом мегапикселей и т.д.

Прочитав краем уха форум Проектирование Бд, услышал про модель Тенцора, не понятно только на сколько просто там можно реализовать поиск по полям справочника, и формирования из результата списка? И на сколько оправдано будет его использование при 3-6 справочниках?
...
Рейтинг: 0 / 0
Структуры данных
    #33740608
eudo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Порадовало вот это
http://bugs.mysql.com/bug.php?id=2435
блин :(
...
Рейтинг: 0 / 0
Структуры данных
    #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
Структуры данных
    #33740623
eudo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, действительно, стратил.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Структуры данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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