Является ли эта база данных подходящей для производства? - PullRequest
0 голосов
/ 21 октября 2018

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

Client
Employee
Automobile
Sales

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

Таблица 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 enter image description here

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

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

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

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

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 является автоматически сгенерированным, тогда ваш первичный ключ для sale_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 );
0 голосов
/ 21 октября 2018

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

Имена ограничений должны содержать имена для 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--------+
                         |            |
                         +------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...