Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Запросы в нормализованной базе -как? / 9 сообщений из 9, страница 1 из 1
01.12.2006, 16:50
    #34171221
makondo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросы в нормализованной базе -как?
Есть 3 таблички. В Оракле, но это несущественно.

1. TABLE C ( usrdb_ID NUMBER, ID NUMBER PK, name VARCHAR2, ... )
2. TABLE CP (usrdb_id NUMBER, id NUMBER PK, cp_type NUMBER, name VARCHAR2 )
3. TABLE CPV (usrdb_id NUMBER, id NUMBER PK, c_ID NUMBER, CP_ID NUMBER, valnum NUMBER, valchar VARCHAR2)

В С хранятся главные записи,
В CP список атрибутов для каждой usr_db
В CPV хранятся значения атрибутов для каждой записи. Если в CP у соответствующего CP_ID записан тип cp_type 1, то тип атрибута вещственный, если 2 - то текст. Соответственно, заполняется поле или valnum или varchar

Можно считать, что поля проиндексированы, и есть составные индексы по C(usrdb_id, ID)
...
Рейтинг: 0 / 0
01.12.2006, 16:56
    #34171253
makondo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросы в нормализованной базе -как?
Черт, Enter нажался сам. Недописал. Вот сообщение полностью

Есть 3 таблички. В Оракле, но это несущественно.

1. TABLE C ( usrdb_ID NUMBER, ID NUMBER PK, name VARCHAR2, ... )
2. TABLE CP (usrdb_id NUMBER, id NUMBER PK, cp_type NUMBER, name VARCHAR2 )
3. TABLE CPV (usrdb_id NUMBER, id NUMBER PK, c_ID NUMBER, CP_ID NUMBER, valnum NUMBER, valchar VARCHAR2)

В С хранятся главные записи,
В CP список атрибутов для каждой usr_db
В CPV хранятся значения атрибутов для каждой записи. Если в CP у соответствующего CP_ID записан тип cp_type 1, то тип атрибута вещственный, если 2 - то текст. Соответственно, заполняется поле или valnum или varchar

Можно считать, что поля проиндексированы, и есть составные индексы по C(usrdb_id, ID)

1 Вопрос. Как лучше всего втакой ситуации задавать запросы типа
SELECT C.*
FROM C , cpv
WHERE usrdb_id = :usrdb_id
and
c.id = cpv.id
AND
.... список условий на значение атрибутов
CP_ID = :CP_Id1 AND valnum = ....
AND
CP_ID = :CP_ID2 and valchar = .....
итд.



2 Вопрос.

Как сделать запрос такого же типа, но чтобы условия на значения атрибутов были сложные, типа

WHERE attribValue1 + attributValue2 <10

или
WHERE attribValue1 + attributValue2 = attribValue3


?
...
Рейтинг: 0 / 0
01.12.2006, 17:00
    #34171273
makondo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросы в нормализованной базе -как?
Если вы знаете, как это сделать не в Оракле, а , например , в MSSQL, скажите плз, как на mssql-вском варианте такой запрос написать. Мне нужно понять сам принцип

На первый вопрос я бы использовал в оракле intersect , но как на второй вопрос ответить - не знаю..
...
Рейтинг: 0 / 0
01.12.2006, 17:25
    #34171361
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросы в нормализованной базе -как?
Эпидемия однако...
Идея разворота EAV в плоскую таблицу -sum()/max()/min()... group by.
Для Oracle .
Если список атрибутов - переменная, то динамический запрос с той же идеей.
Также есть в FAQ.
...
Рейтинг: 0 / 0
02.12.2006, 00:05
    #34172031
makondo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросы в нормализованной базе -как?
ModelRЭпидемия однако...
Идея разворота EAV в плоскую таблицу -sum()/max()/min()... group by.
Для Oracle .
Если список атрибутов - переменная, то динамический запрос с той же идеей.
Также есть в FAQ.

Пример полезный, спору нет. Но мне для начала нужен не агрегирующий запрос, а просто список всех столбцов из С, у которых огрничения на атрибуты типа A1+A2 <A3
Или А1*A2 < 10
Хотя список атрибутов может быть разный, предположим для простоты, что их фиксированное количество, скажем десяток.

Как? :)
...
Рейтинг: 0 / 0
02.12.2006, 04:23
    #34172121
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросы в нормализованной базе -как?
2Makondo
В примере показано, как строки превратить в столбцы. Дальше на эти столбцы можно накладывать любые условия, как при обычной структуре таблиц.
...
Рейтинг: 0 / 0
02.12.2006, 14:20
    #34172351
makondo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросы в нормализованной базе -как?
Блин, не связал вторую таблицу с первой :)

Можете помочь? Связь C с CPV C.Id = CPV.C_ID
...
Рейтинг: 0 / 0
02.12.2006, 14:23
    #34172354
makondo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросы в нормализованной базе -как?
То есть, ничего нельзя сделать кроме вот что-то типа такого

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SELECT c.* 
FROM c,
( SELECT 
      (SELECT cpv.valnum v 
        FROM  cpv 
        WHERE  usrdb_id = :USRDB_UD 
          AND cpv.c_id = cpv.id
          AND cpv.cp_id =   :cp_id1   -- id первого атрибута 
       )  f1,
      (SELECT cpv.valnum v 
        FROM  cpv 
        WHERE  usrdb_id = :USRDB_UD 
          AND cpv.c_id = cpv.id
          AND cpv.cp_id =   :cp_id2   -- id 2го атрибута 
       )  f2,
      (SELECT cpv.valnum v 
        FROM  cpv 
        WHERE  usrdb_id = :USRDB_UD 
          AND cpv.c_id = cpv.id
          AND cpv.cp_id =   :cp_id3   -- id 3го атрибута 
       )  f3,
      ....   и так далее
   FROM dual
   WHERE f1 + f2 <f3
   
) ff 

WHERE c.usrdb_id - :usrdb_id
AND ...ограничения на поля с
AND 




У меня такое предчувствие, что он будет слегка тормозить... :)
...
Рейтинг: 0 / 0
04.12.2006, 09:42
    #34173710
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросы в нормализованной базе -как?
Не,
ну как в FAQ, только в ваших терминах
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    SELECT cpv.c_id, 
         max (CASE cpv.cp_id when :cp_id1  THEN cpv.valnum ELSE NULL END) f1,   
         max (CASE cpv.cp_id when :cp_id2  THEN cpv.valnum ELSE NULL END) f2,   
         max (CASE cpv.cp_id when :cp_id3  THEN cpv.valnum ELSE NULL END) f3,   
      ....  
    FROM  cpv 
    WHERE  usrdb_id = :USRDB_UD 
    GROUP BY cpv.c_id
    HAVING max (CASE cpv.cp_id when :cp_id1  THEN cpv.valnum ELSE NULL END ) + 
           max (CASE cpv.cp_id when :cp_id2  THEN cpv.valnum ELSE NULL END)  <
           max (CASE cpv.cp_id when :cp_id3  THEN cpv.valnum ELSE NULL END)
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Запросы в нормализованной базе -как? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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