|
|
|
Структуры данных
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Есть три вида сущьности, которые необходимо хранить. В первой - 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-[... Тогда просто и красиво, кроме самой таблички, и при мысли добавить еще один вид сущьности... У кого какие мысли по этому поводу? как сделать правильно и красиво? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 23:09 |
|
||
|
Структуры данных
|
|||
|---|---|---|---|
|
#18+
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. только какой смысл выдавать одним списком кашу из разных сущностей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2006, 08:24 |
|
||
|
Структуры данных
|
|||
|---|---|---|---|
|
#18+
Например, сущность это объявление, они бывают например о продаже квартир, с указанием площади, кол-ва комнат. Горшков имеющих диаметр и цвет, фотоаппаратов с разным кол-ом мегапикселей и т.д. Прочитав краем уха форум Проектирование Бд, услышал про модель Тенцора, не понятно только на сколько просто там можно реализовать поиск по полям справочника, и формирования из результата списка? И на сколько оправдано будет его использование при 3-6 справочниках? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2006, 16:41 |
|
||
|
Структуры данных
|
|||
|---|---|---|---|
|
#18+
Порадовало вот это http://bugs.mysql.com/bug.php?id=2435 блин :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2006, 21:12 |
|
||
|
Структуры данных
|
|||
|---|---|---|---|
|
#18+
eudoПорадовало вот это http://bugs.mysql.com/bug.php?id=2435 блин :( так и что? вроде как пофиксили год назад? [11 Mar 2005 18:11] Paul DuBois Noted in 4.1.11 changelog. -- Dmitry ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2006, 21:21 |
|
||
|
|

start [/forum/topic.php?fid=32&tid=1545250]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
154ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 188ms |
| total: | 402ms |

| 0 / 0 |
