Как навязать ссылочную целостность в поле базы данных, условно на другое поле в таблице ссылок? - PullRequest
0 голосов
/ 12 апреля 2020

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

Я пытаюсь закодировать базу данных, используя 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)
  );
...