Основы проектирования реляционных баз данных
Таблица базы данных СУБД SQLBASE создана командами
CREATE TABLE CONTACT(CUSTOMER_ID CHAR(5) NOT NULL,CONTACT_NAME VARCHAR(15) NOT NULL,CONTACT_PHONE DECIMAL(10,0),CONTACT_TEXT LONG VARCHAR,PRIMARY KEY (CUSTOMER_ID, CONTACT_NAME)FOREING KEY CUSTKEY (CUSTOMER_ID) REFERENCES CUSTOMER ON DELETE RESTRICT)PCTFREE 15;CREATE UNIQUE INDEX NDX_CONTACT ON CONTACTON CONTACT (CUSTOMER_ID, CONTACT_NAME)PCTFREE 10;Число строк в таблице = 175000. Оцените размер индекса (в страницах).
CREATE TABLE CONTACT(CUSTOMER_ID CHAR(5) NOT NULL,CONTACT_NAME VARCHAR(15) NOT NULL,CONTACT_PHONE DECIMAL(10,0),CONTACT_TEXT LONG VARCHAR,PRIMARY KEY (CUSTOMER_ID, CONTACT_NAME)FOREING KEY CUSTKEY (CUSTOMER_ID) REFERENCES CUSTOMER ON DELETE RESTRICT)PCTFREE 15;Число строк в таблице = 175000. Средняя длина поля LONG VAR CHAR = 10. Оцените ее размер (в страницах).
CREATE TABLE CONTACT(CUSTOMER_ID CHAR(5) NOT NULL,CONTACT_NAME VARCHAR(25) NOT NULL,CONTACT_PHONE DECIMAL(10,0),CONTACT_TEXT LONG VARCHAR,PRIMARY KEY (CUSTOMER_ID, CONTACT_NAME)FOREING KEY CUSTKEY (CUSTOMER_ID) REFERENCES CUSTOMER ON DELETE RESTRICT)PCTFREE 15;В каком табличном пространстве будет находиться таблица CONTACT?
Требуется разрешить это отношение.
Решение.
create table CUSTOMER(CUSTOMER_NO NUMBER(6) not null,CUSTOMER_NAME VARCHAR2(45) null,CUSTOMER_ADDRESS VARCHAR2(35) null,CUSTOMER_CITY VARCHAR2(45) null,CUSTOMER_STATE CHAR(2) null,CUSTOMER_ZIP NUMBER(5) null,primary key (CUSTOMER_NO))create table SALESMAN(SALESMAN_NO NUMBER(6) not null,SALESMAN_NAME VARCHAR2(45) null,SALESMAN_EMP_NO NUMBER(6) null,SALESMAN_YTD_SALES NUMBER(9,2) null,SALESMAN_QUOTA NUMBER(6) null,SALESMAN_PROD_GRP CHAR(8) null,primary key (SALESMAN_NO))create table CUSTOMER_ SALESMAN(CUSTOMER_NO NUMBER(6) not null,SALESMAN_NO NUMBER(6) not null,primary key (CUSTOMER_NO, SALESMAN_NO),foreing key (CUSTOMER_NO) references CUSTOMER,foreign key (SALESMAN_NO) references SALESMAN)
Требуется разрешить это отношение.
Решение.
create table CUSTOMER(CUSTOMER_NO NUMBER(6) not null,CUSTOMER_NAME VARCHAR2(45) null,CUSTOMER_ADDRESS VARCHAR2(35) null,CUSTOMER_CITY VARCHAR2(45) null,CUSTOMER_STATE CHAR(2) null,CUSTOMER_ZIP NUMBER(5) null,primary key (CUSTOMER_NO))create table SALESMAN(SALESMAN_NO NUMBER(6) not null,SALESMAN_NAME VARCHAR2(45) null,SALESMAN_EMP_NO NUMBER(6) null,SALESMAN_YTD_SALES NUMBER(9,2) null,SALESMAN_PROD_GRP CHAR(8) null,primary key (SALESMAN_NO))create table CUSTOMER_ SALESMAN(CUSTOMER_NO NUMBER(6) not null,SALESMAN_NO NUMBER(6) not null,SALESMAN_QUOTA NUMBER(6) null,primary key (CUSTOMER_NO, SALESMAN_NO),foreing key (CUSTOMER_NO) references CUSTOMER,foreign key (SALESMAN_NO) references SALESMAN)
CREATE CLUSTER cust_c (cust_id varchar(8))INDEX;CREATE INDEX cust_c_id ON CLUSTER cust_c;CREATE TABLE cust (cust_id varchar2(8) NOT NULL REFERENCES customers,ent# number NOT NULL,date_ent date NOT NULL,comment varchar2(60) NOT NULL,…PRIMARY KEY(cust_id, ent#)) CLUSTER cust_c (cust_id);
Созданная таблица кластеризована по колонке cust_id, и все специальные записи о клиента в колонке comment будут расположены в одной странице физической базы данных, либо в смежных страницах. Их можно выбрать за одну операцию поиска по индексу:
SELECT date_ent, comment FROM cust_c WHERE cust_id=:cur_cust;
Комментарий. Ограничение первичного ключа в операторе CREATE сделано, чтобы избежать создания второго индекса.
Является ли такое решение преимуществом с точки зрения утверждения: "Очень немного строк о клиентах имеют специальные записи о клиенте".
Требуется разрешить это отношение.
Решение.
create table CUSTOMER(CUSTOMER_NO NUMBER(6) not null,CUSTOMER_NAME VARCHAR2(45) null,CUSTOMER_ADDRESS VARCHAR2(35) null,CUSTOMER_CITY VARCHAR2(45) null,CUSTOMER_STATE CHAR(2) null,CUSTOMER_ZIP NUMBER(5) null,primary key (CUSTOMER_NO))create table SALESMAN(SALESMAN_NO NUMBER(6) not null,SALESMAN_NAME VARCHAR2(45) null,SALESMAN_EMP_NO NUMBER(6) null,SALESMAN_YTD_SALES NUMBER(9,2) null,SALESMAN_QUOTA NUMBER(6) null,SALESMAN_PROD_GRP CHAR(8) null,primary key (SALESMAN_NO))create table CUSTOMER_ SALESMAN(CUSTOMER_NO NUMBER(6) not null,SALESMAN_NO NUMBER(6) not null,primary key (CUSTOMER_NO, SALESMAN_NO))
Требуется разрешить это отношение.
Решение.
create table CUSTOMER(CUSTOMER_NO NUMBER(6) not null,CUSTOMER_NAME VARCHAR2(45) null,CUSTOMER_ADDRESS VARCHAR2(35) null,CUSTOMER_CITY VARCHAR2(45) null,CUSTOMER_STATE CHAR(2) null,CUSTOMER_ZIP NUMBER(5) null,primary key (CUSTOMER_NO))create table SALESMAN(SALESMAN_NO NUMBER(6) not null,SALESMAN_NAME VARCHAR2(45) null,SALESMAN_EMP_NO NUMBER(6) null,SALESMAN_YTD_SALES NUMBER(9,2) null,SALESMAN_QUOTA NUMBER(6) null,SALESMAN_PROD_GRP CHAR(8) null,primary key (SALESMAN_NO))create table CUSTOMER_ SALESMAN(CUSTOMER_NO NUMBER(6) not null,SALESMAN_NO NUMBER(6) not null)
CREATE CLUSTER cust_c (cust_id varchar(8))INDEX;CREATE INDEX cust_c_id ON CLUSTER cust_c;CREATE TABLE cust (cust_id varchar2(8) NOT NULL REFERENCES customers,ent# number NOT NULL,date_ent date NOT NULL,comment varchar2(60) NOT NULL,…PRIMARY KEY(cust_id, ent#)) CLUSTER cust_c (cust_id);
Созданная таблица кластеризована по колонке cust_id, и все специальные записи о клиента в колонке comment будут расположены в одной странице физической базы данных либо в смежных страницах. Их можно выбрать за одну операцию поиска по индексу:
SELECT date_ent, comment FROM cust_c WHERE cust_id=:cur_cust;
Комментарий. Ограничение первичного ключа в операторе CREATE сделано, чтобы избежать создания второго индекса.
Является ли такое решение преимуществом с точки зрения утверждения: "Все записи о клиентах выбираются для ежегодного отчета".
CREATE CLUSTER cust_c (cust_id varchar(8))INDEX;CREATE INDEX cust_c_id ON CLUSTER cust_c;CREATE TABLE cust (cust_id varchar2(8) NOT NULL REFERENCES customers,ent# number NOT NULL,date_ent date NOT NULL,comment varchar2(60) NOT NULL,…PRIMARY KEY(cust_id, ent#)) CLUSTER cust_c (cust_id);
Созданная таблица кластеризована по колонке cust_id, и все специальные записи о клиента в колонке comment будут расположены в одной странице физической базы данных, либо в смежных страницах. Их можно выбрать за одну операцию поиска по индексу:
SELECT date_ent, comment FROM cust_c WHERE cust_id=:cur_cust;
Комментарий. Ограничение первичного ключа в операторе CREATE сделано, чтобы избежать создания второго индекса.
Является ли такое решение преимуществом с точки зрения утверждения: "При выборке специальных записей о клиенте для клиента выбираются все такие записи".