powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Power Designer One-toOne Ref
7 сообщений из 7, страница 1 из 1
Power Designer One-toOne Ref
    #36047269
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую!

Вот как PD реализует one-to-one mandatory с обеих сторон.

Код: 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.
41.
42.
43.
44.
/*==============================================================*/
/* Table: HUSBAND                                               */
/*==============================================================*/
CREATE TABLE HUSBAND  (
   HUSBAND_ID           INTEGER                         NOT NULL,
   WIFE_ID              INTEGER                         NOT NULL,
   HUSBAND_NAME         VARCHAR2( 60 )                    NOT NULL
);

ALTER TABLE HUSBAND
   ADD CONSTRAINT HUSBAND_PK PRIMARY KEY (HUSBAND_ID);

/*==============================================================*/
/* Index: HUSBAND_WIFE_REF_FK                                   */
/*==============================================================*/
CREATE INDEX HUSBAND_WIFE_REF_FK ON HUSBAND (
   WIFE_ID ASC
);

ALTER TABLE HUSBAND
   ADD CONSTRAINT HUSBAND_WIFE_REF_FK FOREIGN KEY (WIFE_ID)
      REFERENCES WIFE (WIFE_ID);

/*==============================================================*/
/* Table: WIFE                                                  */
/*==============================================================*/
CREATE TABLE WIFE  (
   WIFE_ID              INTEGER                         NOT NULL,
   HUSBAND_ID           INTEGER                         NOT NULL,
   WIFE_NAME            VARCHAR2( 60 )                    NOT NULL
);

ALTER TABLE WIFE
   ADD CONSTRAINT WIFE_PK PRIMARY KEY (WIFE_ID);

/*==============================================================*/
/* Index: HUSBAND_WIFE_REF2_FK                                  */
/*==============================================================*/
CREATE INDEX HUSBAND_WIFE_REF2_FK ON WIFE (
   HUSBAND_ID ASC
);

ALTER TABLE WIFE
   ADD CONSTRAINT HUSBAND_WIFE_REF2_FK FOREIGN KEY (HUSBAND_ID)
      REFERENCES HUSBAND (HUSBAND_ID);
Что совершенно неправильно. Внешние ключи должны выглядеть, как

Код: plaintext
1.
2.
ALTER TABLE HUSBAND
   ADD CONSTRAINT HUSBAND_WIFE_REF_FK FOREIGN KEY (WIFE_ID, HUSBAND)
      REFERENCES WIFE (WIFE_ID, HUSBAND);
и, соответственно

Код: plaintext
1.
2.
ALTER TABLE WIFE
   ADD CONSTRAINT HUSBAND_WIFE_REF2_FK FOREIGN KEY (WIFE_ID, HUSBAND)
      REFERENCES HUSBAND (WIFE_ID, HUSBAND);
иначе, допустим имеем таблицу

Код: plaintext
1.
2.
3.
4.
5.
HUSBAND  WIFE
1, 1     1, 1
2, 2     2, 2
3, 3     3, 3
4, 4     4, 4
5, 5     5, 5

и я поменяю WIFE 2, 2 на 2, 1, то теперь уже две записи WIFE будут ссылаться на одну запись в HUSBAND. Более того, на HUSBAND 2, 2 уже никто не ссылается - сирота! Это уж никак не one-to-one. Почему PD так поступает?
...
Рейтинг: 0 / 0
Power Designer One-toOne Ref
    #36047937
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На мой взгляд, моделируешь ты сам, а PD лишь готовит скрипт на основании твоей модели. Как минимум,
если есть внешний ключ на 2 поля, то в родительской таблице должно быть построено ограничение
уникальности по 2-м полям.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Power Designer One-toOne Ref
    #36049274
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov,

PD не дает создать уникальный индекс, включив туда поле, не принадлежащее сущности на уровне концепуальной модели. А вообще, Денис, это полный бред, то что PD делает. И если я устанавливяю one-to-one между сушностями, меня не волнует как это будет сделано PD, лишь было-бы правильно. И инструмент, к большому сожалению, этого не обеспечивает.
...
Рейтинг: 0 / 0
Power Designer One-toOne Ref
    #36049372
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic HunterPD не дает создать уникальный индекс, включив туда поле, не принадлежащее сущности на уровне концептуальной модели. А вообще, Денис, это полный бред, то что PD делает. И если я устанавливаю one-to-one между сущностями, меня не волнует как это будет сделано PD, лишь было-бы правильно. И инструмент, к большому сожалению, этого не обеспечивает.
Я не знаю, честно говоря, как это делается в концептуальной модели, я с ней не работаю. Но в физической модели сделал бы таблицу FAMILY, со ссылками на HUSBAND и WIFE и соответствующими уникальностями. Если же тебе хочется работать именно с перекрестными ссылками, то имхо можно обойтись в ключах и одним полем, как PD и сделал:
Код: 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.
drop table HUSBAND cascade constraints;
drop table WIFE cascade constraints;

create table HUSBAND  (
   HUSBAND_ID           INTEGER                         not null,
   WIFE_ID              INTEGER                         not null,
   HUSBAND_NAME         VARCHAR( 60 )                     not null,
   constraint PK_HUSBAND primary key (HUSBAND_ID),
   constraint AK_HUSBAND_WIFE unique (WIFE_ID)
);


create table WIFE  (
   WIFE_ID              INTEGER                         not null,
   HUSBAND_ID           INTEGER                         not null,
   WIFE_NAME            VARCHAR2( 60 )                    not null,
   constraint PK_WIFE primary key (WIFE_ID),
   constraint AK_WIFE_HISBAND unique (HUSBAND_ID)
);

alter table HUSBAND add constraint FK_HUSBAND_WIFE
  foreign key (WIFE_ID) references WIFE (WIFE_ID)
  deferrable initially deferred;

alter table WIFE add constraint FK_WIFE_HUSBAND
  foreign key (HUSBAND_ID) references HUSBAND (HUSBAND_ID);

...
Рейтинг: 0 / 0
Power Designer One-toOne Ref
    #36049395
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov,

Да, согласен можно и так, хотя первый (мой) вариант мне нравится больше. CDM модель не обеспечивает ни первого ни второго. При генерации PDM это хорошо видно. Таким образом PD не обеспечивает правильной реализации one-to-one. Более того, создает отношение сушностей one-to-may с возможностью получения orfants. Вот, собственно, и все.
...
Рейтинг: 0 / 0
Power Designer One-toOne Ref
    #36050026
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter,
Вы перенапряглись :) То что вы пытаетесь сделать на уровне БД работать не будет.
Две связи здесь абсолютно избыточны, и об этом абсолютно справедливо предупреждает PD (circular reference) при Check Model в PDM.
Все что нужно сделать, это определить в CDM доминантную роль, а в PDM добавить AK по husband_id в таблице wife, чтобы запретить многоженство :)


P/S/
1-1 обычно используется для эмуляции наследования сущностей в БД.
Для 1-1 нужно знать идентификаторы/альтернативные ключи с обеих сторон.
...
Рейтинг: 0 / 0
Power Designer One-toOne Ref
    #36050036
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pdm
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Power Designer One-toOne Ref
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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