Является ли эта база данных правильной для многих?

У меня вопрос о реализации простой взаимосвязи между четырьмя таблицами.

Client
Employee
Automobile
Sales

Создал их все, но я просто хочу быть уверенным, что у меня не хватает чего-то, что может навредить дизайну db.

Таблица sales является посредником между всеми остальными таблицами. Вот SQL

CREATE TABLE automobile (
    automobile_id           INTEGER NOT NULL,
    automobile_brand        VARCHAR2(16),
    automobile_model        VARCHAR2(16),
    automobile_year         DATE,
    automobile_color        VARCHAR2(12),
    automobile_kilometers   INTEGER,
    automobile_price        NUMBER
);

ALTER TABLE automobile ADD CONSTRAINT automobile_pk PRIMARY KEY ( automobile_id );

CREATE TABLE client (
    client_id          INTEGER NOT NULL,
    client_name        VARCHAR2(25),
    client_address     VARCHAR2(32),
    client_telephone   VARCHAR2(15)
);

ALTER TABLE client ADD CONSTRAINT client_pk PRIMARY KEY ( client_id );

CREATE TABLE employee (
    employee_id          INTEGER NOT NULL,
    employee_name        VARCHAR2(25),
    employee_position    VARCHAR2(15),
    employee_telephone   VARCHAR2(15)
);

ALTER TABLE employee ADD CONSTRAINT employee_pk PRIMARY KEY ( employee_id );

CREATE TABLE sales (
    sale_id         INTEGER NOT NULL,
    client_id       INTEGER,
    automobile_id   INTEGER,
    employee_id     INTEGER,
    sale_date       DATE
);

ALTER TABLE sales ADD CONSTRAINT sales_pk PRIMARY KEY ( sale_id );

ALTER TABLE sales
    ADD CONSTRAINT automobile_id FOREIGN KEY ( automobile_id )
        REFERENCES automobile ( automobile_id );

ALTER TABLE sales
    ADD CONSTRAINT client_id FOREIGN KEY ( client_id )
        REFERENCES client ( client_id );

ALTER TABLE sales
    ADD CONSTRAINT employee_id FOREIGN KEY ( employee_id )
        REFERENCES employee ( employee_id );

ALTER TABLE sales
    ADD CONSTRAINT automobile_id FOREIGN KEY ( automobile_id )
        REFERENCES automobile ( automobile_id );

ALTER TABLE sales
    ADD CONSTRAINT client_id FOREIGN KEY ( client_id )
        REFERENCES client ( client_id );

ALTER TABLE sales
    ADD CONSTRAINT employee_id FOREIGN KEY ( employee_id )
        REFERENCES employee ( employee_id );

и диаграмма ER введите описание изображения здесь

Может ли кто-нибудь, кто знает о дизайне БД, поделиться своим мнением? Спасибо вам большое!

Всего 2 ответа


Сценарии для внешних ключей для автомобиля, клиента и сотрудника кажутся дублируемыми.

Имена ограничений должны содержать имена для таблиц FK и PK, например

fk_sales_client

Таким образом, они не будут конфликтовать с другими именами ограничений при увеличении схемы БД и добавлении новых ограничений. Например, у вас может быть сотрудник, который является ответственным контактным лицом для клиента. С вашей схемой именования вы получаете два ограничения, называемых employee_id (для client->employee и sales->employee ).

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

fk_product_address01
fk_product_address02

или же

fk_product_address_man
fk_product_address_sup

Если один клиент может купить более одного автомобиля за продажу, и это могут быть разные модели автомобилей, тогда вы должны вернуть свой БД. Вам нужна новая таблица подключения sales_item для реализации отношения m-to-n между sales и automobile . Вероятно, эта новая таблица также будет содержать колонку quantity .

 +------------+ +------------+ | | | | | Client | | Employee | | | | | +----+-------+ +---------+--+ ^ ^ | | | +--------------+ | +-------------+ | | o--+ | | +-----o Sales | | Automobile | | | | | +----+---------+ +-------+-----+ ^ ^ | | | +------------+ | | | | | +--------o Sales_Item o--------+ | | +------------+ 

Да, это правда из вашего существующего дизайна базы данных, за один проданный автомобиль куплен только один автомобиль

чтобы преодолеть это ограничение, вы можете разделить таблицу продаж на две

CREATE TABLE sales (
    sale_id         INTEGER NOT NULL,
    client_id       INTEGER,    
    employee_id     INTEGER,
    sale_date       DATE
);

CREATE TABLE sale_items(
    item_id         INTEGER NOT NULL,
    sale_id         INTEGER NOT NULL,   
    automobile_id   INTEGER NOT NULL,   
);

Здесь item_id может быть либо автогенерирован, либо серийный номер за SALE

Если вы решили создать item_id как автогенерируемый, то ваш первичный ключ в sales_items может быть

ALTER TABLE sale_items ADD CONSTRAINT sale_items_pk PRIMARY KEY ( item_id );

если item_id уникален только для продажи, тогда

ALTER TABLE sale_items ADD CONSTRAINT sale_items_pk PRIMARY KEY ( sale_id, item_id );

Есть идеи?

10000