LINUX.ORG.RU

SQL


0

0

Как правильно сделать в SQL:
для каждого справочника (штук 70) создавать свою таблицу sprXXX(id,name)
или все записать в одну таблицу spr(id_spr,id,name),
где id_spr - номер справочника.
Нет ли противоречий с SQL во-втором случае.




anonymous

Разумеется, всё зависит от того, какие у вас будут запросы (к SQL-серверу, конечно :-) ), но IMHO, гораздо предпочтительнее второй вариант. Он позволяет унифицированно:

обращаться сразу к нескольким справочникам

получать список справочников, в том числе с заданными свойствами (количество записей, наличие/отсутствие определённых полей и т.п.)

создавать и удалять справочники.

По поводу возможного противоречия:

Здесь нужно следить за избыточность данных. Если в разных справочниках не может быть одних и тех же данных (речь не идёт о случайном совпадении значений), то схема с одной таблицей подходит.

Если пары (id,name) уникальны в пределах всей системы, но могут входить одновременно в несколько справочников, имеет смысл применить декомпозицию: spr(id_spr,id), values(id,name).

DKorolkov
()

Правильнее будет 2-й вариант. Пойдя по нему, ты сможешь делать запросы по нескольким или всем сразу справочникам, напр:

SELECT * FROM справочники WHERE id_spr in(...) and name like '...'


Правда при этом база отожрет больше места, но за все надо платить.

anonymous
()

> Правда при этом база отожрет больше места, ...

Почему больше?

DKorolkov
()

Дык, столбец "id_spr" нужен, да и дополнительные индексы, наверное, понадобятся.

anonymous
()

Спасибо за ответы.
Только начинаю заниматься SQL (postgresql), после FoxPro.
Я планировал сделать нумерацию по всей таблице spr,
независимо от поля id_spr, то есть сделать id (serial).
id_spr для редактирования содержимого справочников.

Но проблема в том, что справочники служат для отображения данных
основных таблиц, в которых к примеру перечислены все они
(main.spr1 ... main.spr70).
Нужно получать запрос в котором, должна быть расшифровка
справочников (spr.name).
!!! Связь идет нескольких полей main.spr1 ... main.spr70 к spr.id
В этом и есть противоречие.

anonymous
()

> Нужно получать запрос в котором, должна быть расшифровка справочников (spr.name).

> !!! Связь идет нескольких полей main.spr1 ... main.spr70 к spr.id В этом и есть противоречие.

Не совсем понятна задача (и противоречие). Не могли бы вы описать структуру ваших данных?

DKorolkov
()

>Не совсем понятна задача (и противоречие). Не могли бы вы описать структуру ваших данных?

Примерные таблицы:
main (id (serial),фамилия C(20),имя С(20),spr1(int) ... spr70(int)),
spr (id (serial),id_spr (int),name C(70)).

Запрос:
select spr.name from main,spr
where main.spr1=spr.id
AND main.spr2=spr.id
AND main.spr3=spr.id
...
main.spr70=spr.id

Не особо разбираюсь в правильности написания :)

Для каждого поля main.sprXXX получить spr.name за один запрос.

Наверно можно через 70 запросов это сделать:
select spr.name from main.spr where main.spr1=spr.id
...
select spr.name from main.spr where main.spr70=spr.id

Другими словами main хранит информацию по человеку:
адрес,индекс,вид документ и т.д.
Нужно получить:
Иванов Иван Иванович, улица (по коду улицы),
документ (по коду документа).






anonymous
()

>Запрос:

>select spr.name from main,spr

>where main.spr1=spr.id

>AND main.spr2=spr.id

>AND main.spr3=spr.id

>...

>main.spr70=spr.id

IMHO, такой запрос выведет ахинею. Я уже полгода не занимаюсь SQL, а справочника под рукой нет. Кажется, в случае одной таблицы здесь понадобятся вложенные запросы (поправьте, plz кто знает). Для 70 таблиц будет что-то вроде:

SELECT spr.name FROM main, spr1, ..., spr70 WHERE main.spr1=spr1.id AND spr1.name = "name1" AND ... AND main.spr70=spr70.id AND spr70.name = "name70"

В любом случае, запрос получается громоздким, хотя, на самом деле, не сложным. В обоих случаях поможет (не помню, как называется по русски, кажется представление, по английски VIEW). Оно будет выглядеть как таблица вида:

view_main (id (serial),фамилия C(20),имя С(20),name1 C(70), ... name70 C(70))

Короче, читать о SQL (как можно более фундаментальное) и о Postgres (сейчас появились книги на русском). До появления ясности по всем вопросам лучше не браться за практическую реализацию -- ошибки проектирования обходятся слишком дорого. Удачи!

DKorolkov
()

С вашего позволения я выскажу мысль не касаемо последних постингов... Если задача простая и не требует повышенной безопасности - 2 вариант хороший, при так называемой монотонности данных. Однако, если предполагается что с базой будут работать разные люди, относящиеся к различным технологическим цепочкам в огромной организации - то делать нужно отдельные справочники. На каждый справочник нужно давать права пользовательским группам и т.д. Иначее все смогут делать все что угодно, даже если им этого делать нельзя по определению. Отстреливать права на уровне клиента - полнейший отстой, слабоконтролируемый процесс и любой мало мальски грамотный пользователь будет иметь полный доступ ко всем справочникам. Это мое мнение.

Pitcher
()

Ух, ребятки...

А что такое "справочники", позвольте узнать?
Или вы пересидели за 1С-бухгалтерией?

Дилетанты... В реляционных базах есть только таблицы.

anonymous
()

>А что такое "справочники", позвольте узнать?
>Или вы пересидели за 1С-бухгалтерией?

1)Не-а, я пересидел за "FoxPro for DOS".
В меню выдавать название "таблица" как-то неудобно.
Какая разница как ЭТО назвать.
Справочник - таблица с общей информацией:
город, улица, вид документа,...
Как это все назвать???

2)В любой базе есть справочники. Как это реализуется на практике???
Посмотрел пример в Postresql, там View только на одну таблицу.

anonymous
()

> Посмотрел пример в Postresql, там View только на одну таблицу.

Что значит на одну? View можно создать запросом к нескольким таблицам. Или имеется в виду что-то другое?

Советую прочитать Мартина Грабера "SQL" (в оригинале "Mastering SQL").

DKorolkov
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.