|
|
|
Как лучше спроектировать базу?
|
|||
|---|---|---|---|
|
#18+
Всем привет. Собственно вопрос в следующем. Есть таблица t_skv_geo(geo_id, geo_date, skv_id,geo_plasts,...) . В поле geo_plasts храниться множество кодов из справочника t_plast(plast_id,plast_name) . Т.е. поле-множество, значения в котором разделены ; . Например: 1;2;32;655 Я нахожу уникальную запись в t_skv_geo, след.образом SELECT geo_id FROM t_skv_geo WHERE geo_date=... AND skv_id=... AND geo_plast=... . (*) Проблема в том, что ввод значений в такое поле, т.е. заполнение множества - есмь весьма нетривиальная задача и достаточна геморойна ( ListBox для множества, плюс ComboBox для выбора пласта, плюс две функции - для добавления и удаления кода пласта из ListBox, плюс обновление поля-множества перед записью, плюч функции для перевода кодов пластов в имена и обратно ). Вообщем сплошной геморой. Написал я это давно, заглянул и вижу что вроде как - это не есть гуд: хранить в поле множество значений. Возникла идея создать третью таблицу t_geo_plasts(geo_id,plast_id) для развязки отношения M:M между t_skv_geo и t_plast. Вопрос в том как мне переписать запрос (*) с учетом такой развязки? И много ли мне придеться переделывать в интерфейсной части? Вообще интересно узнать отношение проектировщиков к полям-множествам... Всем спасибо за внимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2004, 08:40:34 |
|
||
|
Как лучше спроектировать базу?
|
|||
|---|---|---|---|
|
#18+
Нда, мы не ищем легких путей... Вслух высказывать свое отношение к такой огранизации не буду по вполне понятным причинам:) Непонятно, какой запрос нужно переписать. Интерфейсная часть организуется просто - в основной форме - подчиненная (табличная или ленточная) с источником t_geo_plasts . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2004, 08:50:11 |
|
||
|
Как лучше спроектировать базу?
|
|||
|---|---|---|---|
|
#18+
>отношение к полям множесвам Никогда так не делал. ИМХО это чушь полная >Много ли переделывать А нах переделывать, если все и так работает? Зачем чинить несломаное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2004, 08:55:37 |
|
||
|
Как лучше спроектировать базу?
|
|||
|---|---|---|---|
|
#18+
Будет так: SELECT geo_id FROM t_skv_geo as G INNER JOIN t_geo_plasts as P ON G.geo_id=P.geo_id WHERE geo_date=... AND skv_id=... AND P.plast_id=.... Несмотря на некоторое кажущееся усложнение работать это будет быстрее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2004, 09:42:20 |
|
||
|
Как лучше спроектировать базу?
|
|||
|---|---|---|---|
|
#18+
2 Aleks2: Не подходит, т.к. критерий для geo_plasts = мн-во кодов, тут без вложенного подзапроса не обойтись. Мой вариант: SELECT geo_id FROM t_skv_geo AS T1 WHERE (geo_date=... AND skv_id=... AND (SELECT plast_id FROM t_ge_plasts AS T2 WHERE T2.geo_id=T1.geo_id) IN (..., ..., ...) ) Отрабатывать будет по-любому медленее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2004, 10:27:19 |
|
||
|
Как лучше спроектировать базу?
|
|||
|---|---|---|---|
|
#18+
Замечание: ALL IN Плюс при создании/удалении записей придеться гемороиться с этой развязочной таблицей t_geo_plasts ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2004, 10:32:56 |
|
||
|
Как лучше спроектировать базу?
|
|||
|---|---|---|---|
|
#18+
это стандартное решение для М:М А как вводятся записи? К примеру, у меня через форму и я даже не задумываюсь над этой проблемой, все идет автоматом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2004, 10:36:27 |
|
||
|
Как лучше спроектировать базу?
|
|||
|---|---|---|---|
|
#18+
2 Alexander G: Ну сейчас это множественное поле(1 листбокс) заполняеться через форму по-шамански, как я в заглавии написал. Теперь думаю переделать ... + 1 подчиненка, - красота, + усложнение запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2004, 10:46:12 |
|
||
|
Как лучше спроектировать базу?
|
|||
|---|---|---|---|
|
#18+
Вообщем, оказываться запарос вида SELECT geo_id FROM t_skv_geo AS T1 WHERE (geo_date=... AND skv_id=... AND (SELECT plast_id FROM t_ge_plasts AS T2 WHERE T2.geo_id=T1.geo_id) IN (..., ..., ...) ) НЕ РАБОТАЕТ!! Пишет : "Подзапрос должен возвращать одно значение" Так как же правильно переписать запрос (*) с учетом?! HELP! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2004, 11:27:13 |
|
||
|
Как лучше спроектировать базу?
|
|||
|---|---|---|---|
|
#18+
SELECT geo_id FROM t_skv_geo INNER JOIN t_geo_plasts ON t_skv_geo.geo_id = t_geo_plasts .geo_id WHERE t_geo_plasts.plast_id=1 Or t_geo_plasts.plast_id=1926 GROUP BY t_skv_geo.geo_id HAVING Count( t_skv_geo.geo_id)>1 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2004, 14:49:02 |
|
||
|
Как лучше спроектировать базу?
|
|||
|---|---|---|---|
|
#18+
Ты скажи, ты скажи: что те надо, что те надо... И получишь, что ты хошь... ----------- Какие-такие вложенные запросы? Откель же мне знать что ты должон получить в результате... >>Я нахожу уникальную запись в t_skv_geo, след.образом SELECT geo_id FROM t_skv_geo WHERE geo_date=... AND skv_id=... AND geo_plast=.... (*) >>Есть таблица t_skv_geo(geo_id, geo_date, skv_id,geo_plast s ,...). Ну и я выдал для поиска по 1 пласту. Ежели тебе надо по набору пластов, то набор -> во временную таблицу: t_sel_plasts(plast_id int) SELECT geo_id FROM t_skv_geo as G INNER JOIN t_geo_plasts as P ON G.geo_id=P.geo_id INNER JOIN t_sel_plasts as S ON P.plast_id=S.plast_id WHERE geo_date=... AND skv_id=... GROUP BY geo_id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2004, 15:44:43 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32755051&tid=1670806]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 335ms |

| 0 / 0 |
