0

我有以下表格:

商品 { item_id, item_name, item_price,......}
分区 { Division_id, Division_name, Division_address,.......}
仓库 { 仓库 ID, 仓库名称,........}
仓库分区 { partition_id, partition_name,........}
WarehouseRacks { rack_id, rack_name,.......}

现在,为了跟踪项目的位置,我有下表(关系)。

itemLocation { item_id, Division_id,warehouse_id, partition_id, rack_id, floor_number}

它准确地跟踪项目的位置,但为了获得项目的位置信息,我必须加入五个可能导致性能问题的表。

此外,如果我们不获取整个字段,则该表没有任何主键。这会引起任何问题吗?有没有更好的方法来做到这一点?

谢谢。

4

2 回答 2

2

考虑关系,因为您将信息放入关系数据库中。

这是我的关系猜测。随时纠正它们。

  • 一个部门有一个或多个仓库。

  • 一个仓库有一个或多个仓库分区。

  • 一个仓库分区有一个或多个仓库货架。

  • 仓库货架有一件或多件物品。

.

  • 一个项目位于仓库货架上。

  • 仓库货架位于仓库分区中。

  • 仓库分区位于仓库中。

  • 仓库位于一个部门中。

我希望这对您的数据库设计有所帮助。

编辑添加:我将布置表的索引。您应该能够创建其余的列。

Division
--------
Division ID
...

Warehouse
---------
Warehouse ID
Division ID
...

Warehouse Partition
-------------------
Warehouse Partition ID
Warehouse ID
...

Warehouse Rack
--------------
Warehouse Rack ID
Warehouse Partition ID
...

Item
----
Item ID
Warehouse Rack ID
Item Type ID
...

Item Type
---------
Item Type ID
Item name
Item Price

每个表都有一个主 ID 盲键,可能是一个自动递增的整数或一个自动递增的 long。

除 Division 之外的所有表都有一个指向父表的外键。

Item 表中的一行代表一个项目。一件物品只能在一个仓库货架上。

现代关系数据库连接五个表应该没有性能问题。我已经看到了 30 个表连接。

构建您的系统,解决实际出现的性能问题,而不是花时间担心假设的性能问题。

于 2013-02-14T15:19:38.250 回答
1

正如 Gilbert Le Blanc 所写,您可能不需要加入五个表 - 您可能只需要加入“WarehouseRacks”。

但是,您写道您需要“跟踪” - 这表明涉及时间方面。

这为您提供了以下架构:

Items { item_id, item_name, item_price,......}
Divisions { division_id, division_name, division_address,.......}
Warehouses { warehouse_id, division_id, warehouse_name,........}
WarehousePartitions { partition_id, warehouse_id partition_name,........}
WarehouseRacks { rack_id, partition_id, rack_name,.......} 
ItemLocation (rack_id, item_id, entry_time, quantity, floor_number)

在 ItemLocation 中,所有 3 列都是复合主键的一部分 - 您实际上是在说“在任何时候在给定位置只能有一个项目的实例”。

您仍然必须加入五个表才能检索项目 ID(至少如果您需要地址和名称等)。假设您拥有现代硬件和数据库软件,这应该没问题 - u 除非您处理大量数据,否则外键/主键关系上的 5 路连接不太可能导致性能问题。鉴于您在评论中提到的数量,以及您将在 MySQL 上运行它的事实,我认为您无需担心连接的数量。

此模型的好处是您根本无法将无效数据插入到项目位置表中 - 您不能说该项目位于分区中不存在的机架中,或者说位于分区中不存在的仓库中分配; 如果仓库更改部门,您不必更新所有 item_location 记录。

我创建了一个SQLFiddle来展示它是如何工作的。

“item_location”表是其中最大的关注点——您必须选择是存储快照(这是本设计所做的)还是事务表。使用“快照”视图,您的代码始终会更新“数量”列,有效地表示“截至 entry_time,此机架的此楼层中有 x 个项目”。

“事务”模型允许您插入多条记录——通常在添加项目时为正数,在删除项目时为负数。该位置在任何时间点的项目是这些数量的总和,直到所需时间。

于 2013-02-14T15:29:46.353 回答