Вопрос

Я делал только базы данных без отношений, но теперь нужно сделать что-то более серьезное и правильное.

Вот мой дизайн базы данных:alt text

  1. Кунде = Клиент
  2. Варе = Продукт
  3. Ордер = Порядок (Читать:Хочу сделать заказ)
  4. VareGruppe = хм..типа?(Читать:Автомобиль, стул, шкаф и т. д.)
  5. VareOrdre = Product_Orders

Вот моя схема SQL (SQLite):

CREATE TABLE Post (
    Postnr INTEGER NOT NULL PRIMARY KEY,
    Bynavn VARCHAR(50) NOT NULL
);

CREATE TABLE Kunde (
    CPR INTEGER NOT NULL PRIMARY KEY,
    Navn VARCHAR(50) NOT NULL,
    Tlf INTEGER NOT NULL,
    Adresse VARCHAR(50) NOT NULL,
    Postnr INTEGER NOT NULL 
    CONSTRAINT fk_postnr_post REFERENCES Post(Postnr)
);

CREATE TABLE Varegruppe (
    VGnr INTEGER PRIMARY KEY,
    Typenavn VARCHAR(50) NOT NULL
);


CREATE TABLE Vare (
    Vnr INTEGER PRIMARY KEY,
    Navn VARCHAR(50) NOT NULL,
    Pris DEC NOT NULL,
    Beholdning INTEGER NOT NULL,
    VGnr INTEGER NOT NULL
        CONSTRAINT fk_varegruppevgnr_vgnr REFERENCES Varegruppe(VGnr)
);

CREATE TABLE Ordre (
    Onr INTEGER PRIMARY KEY,
    CPR INTEGER NOT NULL
        CONSTRAINT fk_kundecpr_cpr REFERENCES Kunde(CPR),
    Dato DATETIME NOT NULL,
    SamletPris DEC NOT NULL
);

CREATE TABLE VareOrdre (
    VareOrdreID INTEGER PRIMARY KEY,
    Onr INTEGER NOT NULL
        CONSTRAINT fk_ordrenr_onr REFERENCES Ordre(Onr),
    Vnr INTEGER NOT NULL 
        CONSTRAINT fk_varevnr_vnr REFERENCES Vare(Vnr),
    Antal INTEGER NOT NULL
);

Он должен работать правильно.

Но я в замешательстве Product_Orders.

Как мне создать заказ?Например, 2 продукта с использованием SQL INSERT INTO?Я ничего не могу заставить работать.

До сих пор:

Только когда я вручную вставляю продукты и данные в Product_Orders а затем добавить эти данные в Orders = что делает его завершенным.Или наоборот (создать заказ с помощью 1 SQL, а затем вручную вставить продукты в Product_orders - 1 SQL для каждой записи)

Это было полезно?

Решение

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

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

Другие советы

Попробуй это ...

сначала вам нужно вставить клиента

insert into kunde values(1, 'navn', 1, 'adresse', 1)

затем вы вставляете тип

insert into VareGruppe values(1, 'Type1')

затем вы вставляете товар

insert into vare values(1, 'product1', '10.0', 1, 1)

затем вы добавляете заказ

insert into ordre values(1, 1, '20090101', '10.0')

затем вы вставляете регистр в таблицу product_orders

insert into VareOrdre values (1, 1, 1, 1)

Я думаю, что это оно.:-)

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

insert into vare(Nav, Pris, Beholdning, VGnr) values('product1', '10.0', 1, 1)

Использовать Select @@identity чтобы увидеть значение onr

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

Именно здесь транзакции становятся важными.

http://www.sqlteam.com/article/introduction-to-transactions

Является ли проблема SalesPrice (я предполагаю, что именно это означает SamletPris)?Я вижу, что это проблема.Одним из распространенных дизайнерских решений является наличие двух таблиц:Заказ и линия заказа.Заказ является таблицей заголовка: он будет иметь отношение внешнего ключа к таблице «Клиент» и любым другим данным «верхнего уровня».Таблица OrderLine имеет отношения FK с таблицей Order и таблицей Product, а также с количеством, ценой за единицу и т. д.которые уникальны для позиции заказа.Теперь, чтобы получить цену продажи заказа, вы суммируете (цена за единицу * количество) таблицы OrderLine для этого заказа.Сохранение SalesPrice для всего заказа может вызвать большие проблемы в дальнейшем.

Примечание на всякий случай, если это MySQL:Если вы используете MyISAM, сервер MySQL полностью игнорирует внешние ключи.Вам необходимо установить движок InnoDB, если вы хотите, чтобы какая-либо целостность фактически обеспечивалась на стороне базы данных, а не только в вашей логике.Это не ваш вопрос, но об этом следует знать.

fbinder правильно понял вопрос :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top