Прежде всего, я надеюсь, что любой, кто читает это, хорошо в эти трудные времена.
Я пытаюсь закодировать базу данных, используя MariaDB / MySql, которая может управлять запасами и группами бизнес-операций.
У меня есть таблица категорий транзакции запаса, которая, верьте или нет, детализирует название и влияние транзакции как на количество рук, так и на общую стоимость количества каждой позиции инвентаря. У меня есть таблица транзакций инвентаризации, в которой подробно описана транзакция инвентаризации. Я также планирую иметь несколько таблиц и вложенных таблиц «бизнес-транзакций»: например, sales_orders и sales_order_product_details.
Я хочу связать категорию транзакции инвентаризации с категорией бизнес-транзакции, чтобы можно было проверить наличие ссылка на бизнес-операцию, которая помещается в соответствующее поле в таблице инвентарных транзакций в соответствующей таблице бизнес-транзакций. Я хотел бы сделать это, имея 2 столбца, на которые распространяются условные ограничения: business_transaction_id и business_transaction_line_item_id.
Извините, если вышеизложенное не очень понятно. На практике: склад выдается из магазина для выполнения заказа клиента. Это классифицируется как транзакция sales_issue. Транзакции sales_issue связаны с sales_order и связанными таблицами. Когда значение помещается внутри business_transaction_id и business_transaction_line_item_id, ссылочная целостность обеспечивается путем проверки наличия этих значений в соответствующей таблице бизнес-транзакций.
Возможно ли это с помощью SQL или мне придется выполнить завершить сценарии, чтобы обеспечить это?
Любая помощь или совет, который вы можете дать, были бы очень полезны.
CREATE TABLE inventory_transaction_categories (
category_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
category_name VARCHAR(50) NOT NULL UNIQUE CHECK (category_name != ""),
quantity_effect VARCHAR(20) NOT NULL CHECK (quantity_effect = "increasing" OR quantity_effect = "decreasing" OR quantity_effect = "none"),
value_effect VARCHAR(20) NOT NULL,
business_transaction_table VARCHAR(100) NOT NULL UNIQUE
);
CREATE TABLE inventory_transactions (
transaction_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
transaction_date_time TIMESTAMP NOT NULL,
inventory_transaction_category_id BIGINT UNSIGNED NOT NULL,
business_transaction_id BIGINT UNSIGNED,
business_tansaction_line_item_id INT UNSIGNED,
product_id VARCHAR(50) NOT NULL,
product_quantity INT UNSIGNED NOT NULL,
product_value DECIMAL (15,2) UNSIGNED NOT NULL,
issuing_inventory_location_id INT UNSIGNED NOT NULL,
receiving_inventory_location_id INT UNSIGNED NOT NULL CHECK (issuing_inventory_location_id != receiving_inventory_location_id),
CONSTRAINT product_id
FOREIGN KEY (product_id) REFERENCES product_details(product_id),
CONSTRAINT fk_issuing_location
FOREIGN KEY (issuing_inventory_location_id) REFERENCES inventory_locations(inventory_location_id),
CONSTRAINT fk_receiving_location
FOREIGN KEY (receiving_inventory_location_id) REFERENCES inventory_locations(inventory_location_id),
CONSTRAINT fk_tran_category
FOREIGN KEY (inventory_transaction_category_id) REFERENCES inventory_transaction_categories(category_id)
);
CREATE TABLE sales_orders (
order_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
date_created TIMESTAMP NOT NULL,
order_date DATE NOT NULL,
order_time TIME NOT NULL,
sales_channel_id INT UNSIGNED NOT NULL,
external_reference VARCHAR(100),
customer_name VARCHAR(200),
delivery_address_line_1 VARCHAR(100) NOT NULL,
delivery_address_line_2 VARCHAR(100),
delivery_address_line_3 VARCHAR(100),
delivery_address_city VARCHAR(100) NOT NULL,
delivery_address_county VARCHAR(100),
delivery_address_postcode VARCHAR(10) NOT NULL,
delivery_address_country VARCHAR(100) NOT NULL,
order_status_id INT UNSIGNED,
courier VARCHAR(200),
sales_channel_delivery_service VARCHAR(200),
delivery_service_used VARCHAR(200),
postal_tracking_number VARCHAR(50),
products_net_total_GBP DECIMAL(15, 2) UNSIGNED,
products_total_vat_GBP DECIMAL(15, 2) UNSIGNED,
delivery_charge_vat_code VARCHAR(2),
delivery_charge_net_total_GBP DECIMAL(15, 2) UNSIGNED,
delivery_charge_total_vat_GBP DECIMAL(15, 2) UNSIGNED,
order_net_total_GBP DECIMAL(15, 2) UNSIGNED,
order_vat_total_GBP DECIMAL(15, 2) UNSIGNED,
order_gross_total_GBP DECIMAL(15, 2) UNSIGNED,
CONSTRAINT sales_channel
FOREIGN KEY (sales_channel_id) REFERENCES sales_channels(sales_channel_id),
CONSTRAINT vat_delivery_constraint
FOREIGN KEY (delivery_charge_vat_code) REFERENCES vat_rates(vat_code),
CONSTRAINT order_status_constraint
FOREIGN KEY (order_status_id) REFERENCES order_status_categories(order_status_id)
);
CREATE TABLE sales_order_product_details (
sales_order_id BIGINT UNSIGNED NOT NULL,
line_item_id INT UNSIGNED NOT NULL,
product_id VARCHAR(50) NOT NULL,
quantity INT UNSIGNED NOT NULL,
product_price_GBP DECIMAL(15, 2) UNSIGNED NOT NULL,
discount_GBP DECIMAL (15, 2) UNSIGNED NOT NULL,
net_total_GBP DECIMAL(15, 2) UNSIGNED NOT NULL,
vat_total_GBP DECIMAL(15, 2) UNSIGNED NOT NULL,
PRIMARY KEY(sales_order_id, line_item_id),
CONSTRAINT order_constraint
FOREIGN KEY (sales_order_id) REFERENCES sales_orders(order_id),
CONSTRAINT product_constraint
FOREIGN KEY (product_id) REFERENCES product_details(product_id)
);