оракул (или любой реляционный) вопрос о модели данных. Родитель с постоянным числом Childeren?

Это - конкретная проблема, с которой я много раз сталкивался, но я действительно никогда не находил простое решение этой (на вид) простой проблемы.

Как Вам гарантируют, что данный родитель имеет постоянное число детей?

1) Пример.

Как Вы удостоверяетесь, что данный класс имеет только, скажем, 50 зарегистрированных студентов..?

create table class(
  class_id number primary key,
  class_name varchar2(50),
  class_attributes varchar2(50)
);

create table student(
    student_id number primary key,
    student_name varchar2(50),
    student_attributes varchar2(50)
);

create table class_student_asc(
    class_id number,
    student_id number,
    other_attributes varchar2(50),
    constraint pk_class_student_asc primary key (class_id,student_id),
    constraint fk_class_id foreign key (class_id) references class(class_id),
    constraint fk_student_id foreign key (student_id) references student(student_id)
);

Это реализации, о которых я знаю. Сообщите мне, какой Вы предпочли бы и если существует более простой способ достигнуть этого.

a)

Реализация его с включает дочернюю таблицу (class_student_asc).

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

http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936

b)

Включайте переменную количества в таблицу класса и заблокируйте родительскую запись для обновления прежде, чем ввести рекордную ITO дочерняя таблица.

Так, что-то как..

create table class(
     class_id number primary key,
     class_name varchar2(50),
     class_attributes varchar2(50),
     class_count INTEGER,
     constraint chk_count_Students check (class_count <=5)
);

и вместо того, чтобы выставить таблицу class_student_asc для вставок и так далее... пишут процедуру и затем используют его во всех приложениях..

procedure assign_new_student( 
        i_student_id number,
        i_class_id number)
   is 
   begin
       select class_count
         from class
         where class_id = i_class_id
           for update ; -- or for update nowait, if you want the other concurrent transaction to fail..

   insert into class_student_asc(
       class_id, student_id) 
     values (i_class_id,i_student_id);

   update class
      set class_count = class_count + 1
      where class_id = i_class_id;

   commit;
end assign_new_student;

c)

Существуют, конечно, случаи как пользователь, имеющий два адреса электронной почты. В таком сценарии сам адрес электронной почты не имеет никакого атрибута, и таблица могла быть столь же простой как

create table user_table
          (
            user_id number,
            user_name varchar2(50),
            user_email_primary varchar2(50),
            user_email_secondary varchar2(50)
          );

Однако мы не можем расширить тот же подход для вопроса выше..... как число столбцов, и ограничительные проверки замедлили бы вставки и обновления. Кроме того, это означало бы, что нам будет нужен новый столбец, добавленный каждый раз, мы изменяем правило.. также.

Совет.

5
задан Rajesh Chamarthi 28 July 2010 в 14:49
поделиться