Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Уникальность признака "основной номер"  [new]
rybingleb
Member

Откуда:
Сообщений: 28
Есть справочник номеров абонентов.
create table phones(
customer_id number
,phone number
,primary_flag number check(primary_flag in (0, 1))
);


У абонента может быть много номеров, но основным должен быть только один. Какой можно повесить констреинт, чтобы обеспечить это условие? Просто уникальный индекс по (customer_id, primary_flag) не подойдет, потому что у абонента может быть сколько угодно неосновных номеров.
12 фев 15, 11:07    [17254329]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность признака "основной номер"  [new]
roadster
Member [заблокирован]

Откуда: "Церковь тяжеловооружённого Христа" ©
Сообщений: 52495
rybingleb
Какой можно повесить констреинт, чтобы обеспечить это условие?

я бы копал в эту сторону
sum(primary_flag)

ну и computed или Virtual Column
12 фев 15, 11:45    [17254633]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность признака "основной номер"  [new]
Elic
Member

Откуда:
Сообщений: 29976
rybingleb
У абонента может быть много номеров, но основным должен быть только один.
alter table phones add
  unique_primary_flag generated always as (case when primary_flag = 1 then customer_id end) virtual
    unique
;
12 фев 15, 11:50    [17254670]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность признака "основной номер"  [new]
oragraf
Member

Откуда: Moscow
Сообщений: 1310
rybingleb,
ALTER TABLE PHONES ADD CONSTRAINT PHONES_U02 UNIQUE (CUSTOMER_ID, PHONE) ENABLE VALIDATE;
create unique index Phones_U01 on Phones ( Customer_Id, case Primary_Flag when 0 then Phone end );
12 фев 15, 12:09    [17254824]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность признака "основной номер"  [new]
Elic
Member

Откуда:
Сообщений: 29976
oragraf, для тебя следующие формулировки равнозначны?
  • Данный абонент может иметь только один основной номер.
  • Данный номер может быть неосновным только у одного абонента.
  • 12 фев 15, 12:31    [17255033]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    andreymx
    Member

    Откуда: Запорожье
    Сообщений: 54376
    Elic
    oragraf, для тебя следующие формулировки равнозначны?
  • Данный абонент может иметь только один основной номер.
  • Данный номер может быть неосновным только у одного абонента.
  • у меня был прогер, который в колонках хранил налл и ноль
    12 фев 15, 12:42    [17255112]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    rybingleb
    Member

    Откуда:
    Сообщений: 28
    Elic
    rybingleb
    У абонента может быть много номеров, но основным должен быть только один.
    alter table phones add
      unique_primary_flag generated always as (case when primary_flag = 1 then customer_id end) virtual
        unique
    ;
    


    Что-то в 10.2.0.5.0 не получается.
    12 фев 15, 13:14    [17255421]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    rybingleb
    Member

    Откуда:
    Сообщений: 28
    Сделал просто уникальный функциональный индекс
    create unique index customer_phones_u2
    on customer_phones(case when primary_flag = 1 then customer_id end);
    

    В принципе тоже работает.
    12 фев 15, 13:20    [17255467]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    roadster
    Member [заблокирован]

    Откуда: "Церковь тяжеловооружённого Христа" ©
    Сообщений: 52495
    rybingleb
    Что-то в 10.2.0.5.0 не получается.
    с 11 начиная.
    12 фев 15, 13:28    [17255562]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    Elic
    Member

    Откуда:
    Сообщений: 29976
    rybingleb
    Что-то в 10.2.0.5.0 не получается.
    В следующий раз сообразишь сообщать об этом сразу.
    12 фев 15, 13:52    [17255804]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    rybingleb
    Member

    Откуда:
    Сообщений: 28
    Elic
    rybingleb
    Что-то в 10.2.0.5.0 не получается.
    В следующий раз сообразишь сообщать об этом сразу.


    Виноват, не подумал )
    12 фев 15, 14:09    [17255951]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    О!
    Guest
    это ж мой любимый вопрос на собеседовании

    конечно, возможно афтар не проектировал эту схему, но все же подумай, чьим атрибутом является "первичность" телефона
    12 фев 15, 16:14    [17256953]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    ArtNick
    Member

    Откуда:
    Сообщений: 1227
    О!
    это ж мой любимый вопрос на собеседовании

    конечно, возможно афтар не проектировал эту схему, но все же подумай, чьим атрибутом является "первичность" телефона

    За него уже Elic все придумал.
    12 фев 15, 16:45    [17257158]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    ArtNick
    Member

    Откуда:
    Сообщений: 1227
    О!
    это ж мой любимый вопрос на собеседовании

    конечно, возможно афтар не проектировал эту схему, но все же подумай, чьим атрибутом является "первичность" телефона

    Кстати, а на собеседовании вопрос формулируется как у ТС:
    но основным должен быть только один
    Или все же но основным может быть только один
    12 фев 15, 17:11    [17257300]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    Vint
    Member

    Откуда: Москва
    Сообщений: 4564
    ArtNick,
    за обе формулировки надо бить.
    потому что завтра появится основной рабочий и личный телефон и никогда не узнаешь какой из них бизнес захочет видеть уникальным, а какой нет. а послезавтра еще пару типов телефонов введут.
    12 фев 15, 17:34    [17257443]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    ArtNick
    Member

    Откуда:
    Сообщений: 1227
    Vint
    ArtNick,
    за обе формулировки надо бить.
    потому что завтра появится основной рабочий и личный телефон и никогда не узнаешь какой из них бизнес захочет видеть уникальным, а какой нет. а послезавтра еще пару типов телефонов введут.


    Вот вааще согласен. Богу богово а кесарю кесарево. Бизнес-ограничениям ни в триггерах ни в констрейнах делать нечего.
    12 фев 15, 17:41    [17257469]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    andreymx
    Member

    Откуда: Запорожье
    Сообщений: 54376
    ArtNick
    Vint
    ArtNick,
    за обе формулировки надо бить.
    потому что завтра появится основной рабочий и личный телефон и никогда не узнаешь какой из них бизнес захочет видеть уникальным, а какой нет. а послезавтра еще пару типов телефонов введут.


    Вот вааще согласен. Богу богово а кесарю кесарево. Бизнес-ограничениям ни в триггерах ни в констрейнах делать нечего.
    точно
    уникальность инвентарного номера надо обеспечивать ручкой на бумаге и битьем линейкой по пальцам
    12 фев 15, 19:23    [17257928]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    ArtNick
    Member

    Откуда:
    Сообщений: 1227
    andreymx
    точно
    уникальность инвентарного номера надо обеспечивать ручкой на бумаге и битьем линейкой по пальцам

    Нет, в бизнес-контролях. Только распологать их в констрейнах не нужно.
    13 фев 15, 10:07    [17259207]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    orawish
    Member

    Откуда: Гадюкино-2 (City)
    Сообщений: 15487
    rybingleb,

    баян, однако
    13 фев 15, 11:21    [17259578]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    andreymx
    Member

    Откуда: Запорожье
    Сообщений: 54376
    ArtNick
    andreymx
    точно
    уникальность инвентарного номера надо обеспечивать ручкой на бумаге и битьем линейкой по пальцам

    Нет, в бизнес-контролях. Только распологать их в констрейнах не нужно.
    а в чём же тогда?
    13 фев 15, 17:50    [17262651]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    ArtNick
    Member

    Откуда:
    Сообщений: 1227
    andreymx,
    В пакете бизнес-слоя
    14 фев 15, 00:14    [17263801]     Ответить | Цитировать Сообщить модератору
     Re: Уникальность признака "основной номер"  [new]
    SY
    Member

    Откуда: Middlebury, CT USA
    Сообщений: 10040
    Vint
    потому что завтра появится основной рабочий и личный телефон и никогда не узнаешь какой из них бизнес захочет видеть уникальным, а какой нет.


    А в чем сложность?

    create unique index customer_phones_u2
    on customer_phones(case when primary_flag = 1 then customer_id end,case when primary_flag = 1 then phone_type end);
    


    ArtNick
    Бизнес-ограничениям ни в триггерах ни в констрейнах делать нечего.


    Ну это ты в своих базах так устраивай. Теория прекрасна в теории а на практике нет ничего более дырявого чем имплементация бизнес-ограничений в бизнес-контролях, а чистить базу кому? Да и часто просто невозможно. Естественно, вводить бизнес-ограничения в базе надо без паранойи и с четким пониманием стоимости таких ограничений (триггеров особенно).

    SY.

    Сообщение было отредактировано: 15 фев 15, 03:31
    15 фев 15, 03:29    [17266377]     Ответить | Цитировать Сообщить модератору
    Все форумы / Oracle Ответить