Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / сложный PRIMARY KEY / 25 сообщений из 39, страница 1 из 2
23.01.2003, 17:08
    #32095387
whois
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
Oracle 8.1.5, есть табличка
  CREATE TABLE b (
    b_num NUMBER(6), -- номер объекта
    created DATE DEFAULT SYSDATE, -- дата создания записи об объекте
    info VARCHAR2(100) -- какая-то информация об объекте
  )
Номера b_num уникальны в пределах года, информация о годе, в принципе, есть в поле created . PRIMARY KEY должен быть вроде ( b_num , ГОД). Но
ALTER TABLE b ADD CONSTRAINT pk_b PRIMARY KEY ( b , TRUNC( created ,'YYYY'))
конечно не проходит. Как тут быть - вводить еще одно поле - ГОД ?
...
Рейтинг: 0 / 0
23.01.2003, 17:14
    #32095393
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
а почему не устраивает просто PRIMARY KEY (b, created) ? Ну будет ключ на несколько байт больше, ну и что?
...
Рейтинг: 0 / 0
23.01.2003, 17:55
    #32095428
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
Толковые разработчики делают так: в каждой таблице добавляется дополнительный столбец, который используется именно как первичный ключ и никакой другой информативности не несёт и логически с другими столбцами никак не связан. Значение столбца берётся из сиквенса при каждой вставке новой строки.

Вот и всё.
...
Рейтинг: 0 / 0
23.01.2003, 18:02
    #32095438
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
Усова на тебя нет;)
...
Рейтинг: 0 / 0
23.01.2003, 18:05
    #32095441
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
2 софтбилдер

Это не такой уж однозначный вопрос.
...
Рейтинг: 0 / 0
23.01.2003, 18:39
    #32095471
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
Давайте раскроем тему подробно :)
По мне так искусственный PK нужен тогда, когда он будет использоваться в другой таблице для организации ссылочной целостности, дабы не городить огород.
...
Рейтинг: 0 / 0
23.01.2003, 18:41
    #32095475
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
...что, строго говоря, не исключает наличия unique-ограничения по полям, представляющим собой настоящий PK.
...
Рейтинг: 0 / 0
23.01.2003, 19:02
    #32095510
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
Кстати, query rewrite с какой версии появился?
У меня на 8.1.7EE, например, вполне проходит вариант
Код: plaintext
1.
2.
3.
SQL> create unique index pk_b on b (b_num, trunc(created,'YYYY'));

Index created.

При условии наличия привилегии query rewrite у юзера.
...
Рейтинг: 0 / 0
24.01.2003, 10:35
    #32095710
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
"представляющим собой настоящий PK."

Что значит настоящий PK????? Давайте вспомним что такое PK и для чего он
нужен вообще.

Код: plaintext
1.
2.
Первичный ключ(primary key) - это атрибут или группа атрибутов, 
однозначно идентифицирующая экземпляр сущности.

Всё - это единственное правильное определение PK.
Использование же термина "настоящий PK" или "не настоящий PK"
применительно к специальному атрибуту(столбцу) или к атрибутам самой
сущности является некорректным, иначе говоря просто отсебятина.

Требование а PK
Код: plaintext
1.
2.
3.
Значение атрибутов первичного ключа не должно меняться в течении всего
времени существования экземпляра сущности.
Каждая сущность должна иметь хотя-бы один потенциальный ключ.


Исходя из вышеуказанного становится понятно, что использование именно
специального столбца является самым правильным для использованием в
качестве PK. Он гарантировано никогда не будет изменяться, потому-что он не
связан логически с сущностью. Сущность же вообще может не иметь
собственных атрибутов, которые могли бы обеспечивать PK, поэтому именно
введение специального столбца решает эту проблему.
...
Рейтинг: 0 / 0
24.01.2003, 11:10
    #32095744
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
Вот не надо грязи и теоретических изысканий :) А то уж очень всесоюзной помойкой под названием su.dbms попахивать начинает.

В данном конкретном случае ключом является номер объекта+год. Он есть. Точка. Если ни в одной другой таблице на эти сущности ссылаться не надо - зачем приделывать к таблице ещё что-то? Если технически реализовать такой сложный ключ можно - зачем вводить дополнительное поле?

killed прав - вопрос неоднозначный, но не с теоретической, а с практической точки зрения...
...
Рейтинг: 0 / 0
24.01.2003, 11:26
    #32095760
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
"Вот не надо .......теоретических изысканий "

Ну почему же надо? Похоже ты их тех умельцев "самостийных токарей", которые знают как всё делать.
...
Рейтинг: 0 / 0
24.01.2003, 11:31
    #32095765
Igor Sablin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
По-моему именно "самостийные токари" знают какое решение САМОЕ правильное :-)
...
Рейтинг: 0 / 0
24.01.2003, 12:05
    #32095802
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
Потому что теория, конечно, великая вещь, однако гордость за соответствие заветам не всегда оправдывает медлительность работы и/или глюки. Банально - если у сущности есть некий набор атрибутов, уникально её идентифицирующий среди других сущностей, этот набор является PK. Если бы всё было чиса по Дейтам и пр., так бы все и делали. И внешние ключи были бы композитными. И нахрен не нужны всякие навязанные id. Но так работать неудобно и ресурсоёмко в большинстве случаев. Дешевле ввести id и работать с ним, а естественный PK ограничить unique-констрейнтом, так, как я показал выше. Нужны цифры? Будут, но позже.

Есть ещё интересный момент из области практической реализации - в какой-то подверсии 8.1.6 был баг с таблицами, у которых не задан PK. За давностью лет не помню суть проблемы, подниму переписку если - запостю сюда.
...
Рейтинг: 0 / 0
24.01.2003, 12:23
    #32095821
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
В конце концов, есть статейка весьма уважаемого мистера Адамса на эту тему - http://www.ixora.com.au/tips/design/synthetic_keys.htm - там и "как" и "почему". Если подумать над "почему", вполне легко решить, нужен ли здесь синтетический ключ, или не нужен.
...
Рейтинг: 0 / 0
24.01.2003, 12:33
    #32095832
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
...
Рейтинг: 0 / 0
24.01.2003, 12:40
    #32095838
ksukhonosenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
Товарищи, не надо забывать о ПОТЕНЦИАЛЬНЫХ КЛЮЧАХ - их может быть много - потом из них выбирается один - он и становиться ПЕРВИЧНЫМ.

Так что вот.
...
Рейтинг: 0 / 0
24.01.2003, 13:26
    #32095880
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
Кстати, та трабла, о которой я говорил, оказывается, есть и в 8.1.7.0.0

Итак:
Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
create or replace procedure calc_rating as
begin
    update
        ratings
    set
        ksi_j = dbms_random.value(- 1 , 1 )
    where
        ( 1  =  1 )
        and id in 
        (
            select
                r.id
            from
                ratings r
            where
                ( 1  =  1 )
                and exists
                (
                    select
                         1 
                    from
                        ratings r1
                    where
                        ( 1  =  1 )
                        and (r1.id = r.id)
                        and (trunc(dbms_random.value( 1 ,  7 )) =  1 )
                )
        );
end;
/
declare i number;
begin
for i in  1 .. 70000  loop
   insert into ratings (id, ksi_j)values (i, 0 );
end loop;
end;
/
begin calc_rating; end;
/
select count(*) from ratings union all select count(*) from ratings where ksi_j !=  0 ;


Ни обновляет ни одной строки, хотя должна ~1/7. После добавления PK на ratings по id всё начинает зашибательски работать. Может кто-нибудь объяснить?
...
Рейтинг: 0 / 0
24.01.2003, 13:32
    #32095881
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
Забыл про таблицу :)

Код: plaintext
1.
create table ratings (id number( 10 ) not null, ksi_j number( 10 ,  9 ) not null);
...
Рейтинг: 0 / 0
24.01.2003, 13:49
    #32095907
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
А где COMMIT?
...
Рейтинг: 0 / 0
24.01.2003, 14:01
    #32095926
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
И вообще кто вас научил где не поподя вставлять (1=1)? Что вы какой-то хе.....ней занимаетесь? (1=1) всегда возвращает TRUE, это означает, что в целом в условии (операнд AND операнд )всё зависит только от другого условия. Научись сначала запросы писать, потом в дисскусию вступать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
( 1  =  1 )
        and id in 
        (
            select
                r.id
            from
                ratings r
            where
                ( 1  =  1 )
                and exists
                (
                    select
                         1 
                    from
                        ratings r1
                    where
                        ( 1  =  1 )
...
Рейтинг: 0 / 0
24.01.2003, 14:08
    #32095936
ksukhonosenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
да ладно, нормально написано. Особенно нормально, когда SQL динамически строиться. Тогда "приклеивать" условия удобно.
...
Рейтинг: 0 / 0
24.01.2003, 14:16
    #32095941
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
Смотри сюда, уважаемый бильдер:

1. commit забыл написать сюда, однако он не есть причина проблемы

2. (1 = 1) к вопросу отношения не имеет - "так сложилось исторически" :) Запросы я писать умею, возможно, не так утончённо, но тем не менее это никак не влияет на то, как оно работает (точнее, не работает).

Если нечего сказать по делу - лучше молчи. Обосрать кого угодно я тоже могу, только желания не испытываю.
...
Рейтинг: 0 / 0
24.01.2003, 14:22
    #32095949
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
Код: plaintext
1.
....Обосрать кого угодно я тоже могу, только желания не испытываю....


Несомневаюсь. Я это уже давно понял.
...
Рейтинг: 0 / 0
24.01.2003, 14:47
    #32095980
ksukhonosenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
"Смотрите, не подеритесь, ... парни" :)
...
Рейтинг: 0 / 0
24.01.2003, 14:49
    #32095982
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный PRIMARY KEY
Для особо, так сказать, процедуру написал покороче:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create or replace procedure calc_rating as
begin
    update ratings
    set ksi_j = dbms_random.value(- 1 ,  1 )
    where id in 
        (
        select r.id from ratings r
        where exists 
            (
            select  1  from ratings r1 
            where (r1.id = r.id) and (trunc(dbms_random.value( 1 ,  7 )) =  1 )
            )
        );
end;
/


Естественно, никаких изменений в функционировании. Кстати, если повторно запустить процедуру на таблице без ключа, обновятся все её строки, что, опять же, неверно.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / сложный PRIMARY KEY / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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