Database 仓库的数据模型

Database 仓库的数据模型,database,database-design,Database,Database Design,我需要一个数据库来配置仓库。到目前为止,我有3张桌子: 仓库(1)有多条车道(n) 通道(1)有多个机架(n) 机架(1)有许多机架 现在每个表都有一个明显的ID和一个描述/名称 Shelfs表包含一个stack_id(托盘),因此我可以跟踪哪些货架被占用,哪些是空闲的,以及哪些堆栈位于何处 我的一个问题是,每条车道可以包含不同数量的机架。例如通道A有10个机架,通道B有8个机架。因此,只需设置一个简单的矩阵(车道*机架*机架不起作用) 我需要能够计算仓库占用率,当然也能够跟踪特定堆栈的位置

我需要一个数据库来配置仓库。到目前为止,我有3张桌子:

  • 仓库(1)有多条车道(n)
  • 通道(1)有多个机架(n)
  • 机架(1)有许多机架
现在每个表都有一个明显的ID和一个描述/名称

Shelfs表包含一个stack_id(托盘),因此我可以跟踪哪些货架被占用,哪些是空闲的,以及哪些堆栈位于何处

我的一个问题是,每条车道可以包含不同数量的机架。例如通道A有10个机架,通道B有8个机架。因此,只需设置一个简单的矩阵(车道*机架*机架不起作用)

我需要能够计算仓库占用率,当然也能够跟踪特定堆栈的位置

我的问题是:我真的需要为此使用3个单独的表吗?有更好的方法吗

另一个问题是:如果选择的命名(车道、货架和货架)是正确的(我不是英语母语)


非常感谢

如果车道可以有不同数量的机架,将这些信息存储在表中是很有意义的

-- Predicate: "Warehouse number <warehouse_num> is called <warehouse_name>."
create table warehouses (
  warehouse_num integer primary key,
  warehouse_name varchar(45) not null unique
);

-- Predicate: "Warehouse number <warehouse_num> contains lane <lane_num>."
-- This table allows different numbers of lanes per warehouse. If you change
-- the data type to, say, varchar(2) or varchar(3), you can accommodate 
-- different lane "names" in each warehouse. For example, one warehouse 
-- might name its lanes "Lane 1" and "Lane 2", while a different warehouse 
-- might use "Lane A" and "Lane B2".
create table lanes (
  warehouse_num integer not null references warehouses (warehouse_num),
  lane_num integer not null check (lane_num > 0),
  primary key (warehouse_num, lane_num)
);

-- Predicate: "Lane <lane_num> in warehouse <warehouse_num> contains rack 
-- <rack_num>."
-- Allows a different number of racks in each lane.
create table racks (
  warehouse_num integer not null,
  lane_num integer not null,
  rack_num integer not null check (rack_num > 0),
  primary key (warehouse_num, lane_num, rack_num),
  foreign key        (warehouse_num, lane_num) 
    references lanes (warehouse_num, lane_num)
);

-- Predicate: "Rack <rack_num> in lane <lane_num> in warehouse 
-- <warehouse_num> contains shelf <shelf_num>."  Allows a different
--  number of shelves in each rack.
create table shelves (
  warehouse_num integer not null,
  lane_num integer not null,
  rack_num integer not null,
  shelf_num integer not null check (shelf_num > 0),
  primary key (warehouse_num, lane_num, rack_num, shelf_num),
  foreign key        (warehouse_num, lane_num, rack_num) 
    references racks (warehouse_num, lane_num, rack_num)
);

-- "Contents" might be a better name than inventory.  You might also need 
-- a unique constraint on stack_id. 
-- Predicate: "Stack <stack_id> is stored in warehouse <warehouse_num> in lane 
-- <lane_num> in rack <rack_num> on shelf <shelf_num>."
create table inventory (
  warehouse_num integer not null,
  lane_num integer not null,
  rack_num integer not null,
  shelf_num integer not null,
  stack_id integer not null,
  primary key (warehouse_num, lane_num, rack_num, shelf_num, stack_id),
  foreign key (warehouse_num, lane_num, rack_num, shelf_num)
    references shelves (warehouse_num, lane_num, rack_num, shelf_num)
);
--谓词:“调用仓库编号。”
创建表仓库(
warehouse_num整数主键,
仓库名称varchar(45)非空唯一
);
--谓词:“仓库编号包含通道。”
--此表允许每个仓库使用不同数量的车道。如果你改变
--您可以将数据类型设置为varchar(2)或varchar(3)
--每个仓库中有不同的车道“名称”。例如,一个仓库
--可能将其车道命名为“车道1”和“车道2”,而另一个仓库
--可能使用“A车道”和“B2车道”。
创建表格通道(
仓库数量整数不为空引用仓库(仓库数量),
车道数整数非空检查(车道数>0),
主键(仓库编号、车道编号)
);
--谓词:“仓库中的通道包含机架
-- ."
--允许每个通道中有不同数量的机架。
创建桌架(
仓库数量整数不为空,
lane_num整数不为空,
rack_num整数非空检查(rack_num>0),
主键(仓库编号、车道编号、货架编号),
外键(仓库编号、车道编号)
参考车道(仓库数量、车道数量)
);
--谓词:“仓库通道中的货架
--包含工具架。“允许使用不同的
--每个机架中的机架数量。
创建表架(
仓库数量整数不为空,
lane_num整数不为空,
rack_num整数不为空,
shelf_num整数非空检查(shelf_num>0),
主键(仓库编号、车道编号、货架编号、货架编号),
外键(仓库号、车道号、货架号)
参考货架(仓库数量、车道数量、货架数量)
);
--“目录”可能比库存更好。您可能还需要
--堆栈id上的唯一约束。
--谓词:“堆栈存储在通道中的仓库中
--在架子上的架子上。”
创建表库存(
仓库数量整数不为空,
lane_num整数不为空,
rack_num整数不为空,
shelf_num整数不为空,
堆栈id整数不为空,
主键(仓库编号、通道编号、货架编号、货架编号、堆栈编号),
外键(仓库号、车道号、货架号、货架号)
参考货架(仓库数量、车道数量、货架数量、货架数量)
);
我假设车道、货架和货架都有编号。如果他们不是,用他们的名字代替。通过使用实际的车道名称、机架名称和机架名称而不是无意义的id号,对库存的查询无需连接即可生成人类可读的结果。即使你的仓库是一个配送中心,它也会很快被撕碎

表之间的外键约束为您提供了非常高的数据完整性,至少在标识货架、机架等方面是如此。其中大多数只需填充一次,并且仅在重新配置仓库的通道和机架时更新


术语:您的“车道”通常称为过道或行。我从来没有见过一排排在仓库里用英语叫小巷,但我明白你的意思。无论您为谁构建此文件,如果您询问他们,他们都会告诉您。

您可以通过反转路径来解决“不规则矩阵”问题:架子有一个父机架。机架具有父通道。仓库里有一条小路。所以:每个对象只需要一个父指针,多个对象可以指向同一个父对象。可以将模型的级别组合到递归模型中。您甚至可以对其设置约束(车道不能有机架作为父级),您是否建议仅对一个表使用该约束?基本上是一个parent_id列和记录类型(仓库、车道、货架、货架)的属性?是的,这基本上是我的观点。在递归模型中,Is很难对拓扑设置约束(“每个机架不超过12个盒子”),但在大多数情况下,现实会对此设置足够的约束。如果你是荷兰人,读一下维尔德维克。