Câu hỏi thiết kế bảng cơ sở dữ liệu


7

Thứ nhất, cơ sở dữ liệu người mới ở đây. Tôi đang cố gắng tạo một hệ thống để xử lý Đơn đặt hàng thành Đơn đặt hàng và sau đó chia Đơn đặt hàng thành Container vận chuyển. Các hệ thống cần có thể chia Mục hàng đơn hàng thành 2 đơn hàng trở lên và Mục hàng đơn hàng mua thành 2 hoặc nhiều Container vận chuyển.

Sẽ có một số (rất nhiều) điều chỉnh qua lại trong đó một khi Mục hàng của Đơn đặt hàng được phân tách và đưa vào nhiều Đơn đặt hàng, nó có thể được phân chia khác nhau sau này. Và tương tự khi một Mục hàng Đơn đặt hàng được xử lý thành Container vận chuyển. Cả đời tôi không thể xử lý tốt nhất hoạt động này.

Nếu nó hữu ích, đây là các bảng tôi có cho đến nay với một số chi tiết bị loại trừ cho ngắn gọn:

CREATE TABLE PurchaseOrder (
    Id INTEGER UNSIGNED UNIQUE NOT NULL AUTO_INCREMENT,
    PurchaseOrderNumber VARCHAR(15) UNIQUE,

    PRIMARY KEY(Id)
);  

CREATE TABLE Container (
    Id INTEGER UNSIGNED UNIQUE NOT NULL AUTO_INCREMENT,
    ContainerName VARCHAR(20) UNIQUE,
    PurchaseOrderId INTEGER UNSIGNED,

    PRIMARY KEY(Id),
    FOREIGN KEY(PurchaseOrderId) REFERENCES PurchaseOrder(Id),
);

CREATE TABLE SalesOrder (
    Id INTEGER UNSIGNED UNIQUE NOT NULL AUTO_INCREMENT,
    ClientId INTEGER UNSIGNED,
    SalesOrderNumber VARCHAR(10),

    PRIMARY KEY(Id),
    FOREIGN KEY(ClientId) REFERENCES Client(Id)
);

CREATE TABLE SalesOrderLineItem (
    Id INTEGER UNSIGNED UNIQUE NOT NULL AUTO_INCREMENT,
    SalesOrderId INTEGER UNSIGNED,
    ProductId INTEGER UNSIGNED,
    Qty INTEGER,
    Price DECIMAL(5,2),
    Cost DECIMAL(5,2),

    PRIMARY KEY(Id),
    FOREIGN KEY(SalesOrderId) REFERENCES SalesOrder(Id),
    FOREIGN KEY(ProductId) REFERENCES Product(Id)
);

CREATE TABLE PurchaseOrderLineItem (
    Id INTEGER UNSIGNED UNIQUE NOT NULL AUTO_INCREMENT,
    PurchaseOrderId INTEGER UNSIGNED,
    SalesOrderId INTEGER UNSIGNED,
    ProductId INTEGER UNSIGNED,
    ClientId INTEGER UNSIGNED,
    MfgId INTEGER UNSIGNED,

    PRIMARY KEY(Id),
    FOREIGN KEY(PurchaseOrderId) REFERENCES PurchaseOrder(Id),
    FOREIGN KEY(SalesOrderId) REFERENCES SalesOrder(Id),
    FOREIGN KEY(ProductId) REFERENCES SalesOrder(Id),
    FOREIGN KEY(ClientId) REFERENCES Client(Id),
    FOREIGN KEY(MfgId) REFERENCES Mfg(Id)
);

Tôi đang suy nghĩ để tạo các bảng kết hợp bổ sung giữa Mục hàng đơn hàng và Đơn đặt hàng mua và để mua Mục hàng và bộ chứa đơn hàng để theo dõi loại chia tách và trả lại này?

Giúp đánh giá cao!


1
Bạn chỉ đang cố gắng kiểm tra những gì đã xảy ra hoặc bạn cần chỉ ra những dòng nào được gán cho một PO / container cụ thể tại một thời điểm nhất định?
Chris Saxon

1
Cần biết dòng nào được gán cho PO nào và sau đó là Container nào. Vấn đề là một dòng SO của sản phẩm A có 100 qty có thể được chia thành 2 PO mỗi loại 50 qty và sau đó đặt vào 4 thùng chứa 25 qty mỗi sản phẩm. Để tiếp tục giải quyết vấn đề, quá trình này sẽ được hoàn nguyên nhiều lần về trạng thái ban đầu là 100 qty và sau đó được phân phối lại giữa các PO, Container theo cách khác.
Người dùng007

Một mục hàng để bán hàng yêu cầu tối thiểu bốn container vận chuyển? Có đúng không?
Mike Sherrill 'Nhớ lại mèo'

Không, tối thiểu là 1 container, nhưng số lượng container là một biến. Vấn đề tôi không thể giải quyết ngay bây giờ là một khi một chi tiết đơn hàng bán hàng được phân bổ thành x số PO, nó có thể và sẽ thay đổi thành y số PO (và có thể sẽ thay đổi thành z số PO ...) . Tương tự với một mục hàng PO khi được phân bổ vào x container. Chúng tôi có một hoạt động lộn xộn đòi hỏi rất nhiều tính linh hoạt.
Người dùng007

Câu trả lời:


1

Nói chung, hãy cẩn thận với các khóa được tạo tự động. Nếu bạn cần một cái để thuận tiện cho người dùng , OK, nhưng bạn vẫn nên thực thi khóa tự nhiên.

Ví dụ: bạn có Purchasingder. Nó có một khóa duy nhất, được cung cấp bên ngoài. sử dụng nó. Thêm giá trị tự động tạo của riêng bạn thêm phức tạp và không có gì khác.

Tương tự, SalesOrderLineItem.Id là duy nhất trong toàn bộ bảng. Bạn có muốn xem dòng 1, 2, 3 hơn 62783444, 62783445, 62783446 không? Điều đó làm cho khóa chính SaleOrderID, LineItem (thay vì Id). Tương tự như vậy đối với PurchasingderderLineItem, sau đó nhận được khóa của Purchorder, LineItem.

Bạn đề cập đến "chia tách" một vài lần; Tôi hiểu bạn có nghĩa là một số lượng Bán hàng nhất định có thể được phân bổ cho nhiều hơn một đơn đặt hàng và Đơn đặt hàng vận chuyển. Chống lại sự cám dỗ (nếu có) để sử dụng một kích hoạt để thực thi mối quan hệ, giả sử, tổng số tiền vận chuyển không nhiều hơn được đặt hàng. Loại câu hỏi đó có thể được triển khai trong SQL, và nên, nhưng không phải là một ràng buộc toàn vẹn tham chiếu. Viết một thủ tục được lưu trữ để xác minh đơn hàng là "trong giới hạn" và gọi nó từ ứng dụng của bạn vào thời điểm thích hợp. Điều đó sẽ cho phép các tình huống bất thường trong thế giới thực như các lô hàng bị mất và các đơn đặt hàng bị phá hỏng.

Ngoài ra, bạn dường như đang quay cho 3NF, đây là một nơi tốt. Nếu bạn tiếp tục tuân theo các mối quan hệ 1: n để xác định các bảng và thực thi các ràng buộc một cách chặt chẽ, có thể bạn sẽ kết thúc với một thiết kế âm thanh.


0
CREATE TABLE PurchaseOrderLineItem (
    Id INTEGER UNSIGNED UNIQUE NOT NULL AUTO_INCREMENT,
    PurchaseOrderId INTEGER UNSIGNED,
    SalesOrderLineItemId INTEGER UNSIGNED,
    SubQty INTEGER UNSIGNED,
    ContainerID INTEGER UNSIGNED,
    ClientId INTEGER UNSIGNED,
    MfgId INTEGER UNSIGNED,

    PRIMARY KEY(Id),
    FOREIGN KEY(PurchaseOrderId) REFERENCES PurchaseOrder(Id),
    FOREIGN KEY(SalesOrderLineItemId) REFERENCES SalesOrderLineItem(Id),
    FOREIGN KEY(ContainerID) REFERENCES Container(Id),
    FOREIGN KEY(ClientId) REFERENCES Client(Id),
    FOREIGN KEY(MfgId) REFERENCES Mfg(Id)
);

Liên kết với SalesOrderLineItem sẽ cho phép bạn có nhiều chi tiết đơn hàng mua trong các thùng chứa khác nhau cho bất kỳ chi tiết đơn hàng nào.

Chẳng hạn, SubQty có thể là 25 trong bốn Purchasingderderine và tổng số lượng 100 trong SalesOrderLineItem.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.