【问题标题】:System that keeps track of inventory with a history table使用历史表跟踪库存的系统
【发布时间】:2019-04-12 14:24:12
【问题描述】:

我有一个允许会员租用设备的系统,并且该系统应该有每个租用物品和租用者的历史记录。系统还应该跟踪谁有哪些设备租用/签出,还应该按类型、状态、名称等对设备进行分类。最后它还应该发送过期设备的通知电子邮件。

我正在尝试了解这些关系以及我应该如何建模。截至目前,我目前的表格和想法是这样的:

Member Table:
Id (PK)
MemberId
FirstName
LastName
Email

EquipmentItem Table:
Id (PK)
EquipmentName
EquipmentType (FK)
EquipmentStatus (FK)
TotalQuantity
RemainingQuantity

EquipmentStatus Table:
Id (PK)
StatusName

EquipmentType Table:
Id (PK)
TypeName

EquipmentRentalHistory Table:
Id (PK)
MemberId (FK)
EquipmentId (FK)
CheckOutDate
ReturnedDate

1) 我想知道这些之间的关系,租赁历史是否是 Member 表和 EquipmentItem 表之间的多对多关系?

2) EquipmentItem 表的状态和类型之间是否存在一对多关系,我认为 EquipmentItems 可以有多种状态或类型,但每个状态或每种类型只能属于一个 EquipmentItem。

3) 在 EquipmentItem 中有一个数量字段是否有意义,我曾经在杂货店工作,所以我将逻辑基于相同产品通常具有相同条形码的条形码,例如(Cheetos Puff 薯片)所有 Cheetos Puff 薯片都有相同的条形码,但上面会有数量值。还是让每件商品都独一无二,无论它是否是相同的产品/型号会更好?

我的逻辑是:

  1. 会员出租物品
  2. 系统将其记录到历史记录表中
  3. 然后系统会检查到目前为止已签出多少相同项目,如果说我们该项目的总数量为 4 并且 3 个成员已签出
  4. 我们将剩余数量字段更新为差异,因此在本例中为 1
  5. 然后系统可以通过返回所有返回日期为 null 的记录来跟踪谁签出了哪些内容
  6. 然后系统将检查所有返回日期为空的记录,然后在签出日期进行日期范围以确定设备是否过期
  7. 向与步骤 6 中所述记录关联的成员电子邮件发送通知

我希望得到一些帮助,以更好地理解它们之间的关系,如果我的表格建模正确,如果没有,如果有人能指出我改进这一点的正确方向,那就太好了。

【问题讨论】:

    标签: sql-server database data-modeling


    【解决方案1】:

    回答您的问题

    1. 关于 ERD 中的建模,我认为这不符合多对多关系的条件,而是 EquipmentRentalHistory 是它自己的实体,与 @987654322 都具有多对多关系@ 和 EquipmentItem

      多对多更像是,“Member 可以访问 0...n EquipmentItems,并且每个 EquipmentItem 都可以通过 0...n Members 访问”。


    1. 我不同意它们是一对多的关系。

      一个氧气罐和一对脚蹼都可以归类为“潜水装备”,并且状态为“已签出”。

      您可以拥有多个“Scuba Gear”标签并将每个唯一的“Scuba Gear”标签分配给它自己的EquipmentItem,但是您只需为每个新的EquipmentItem 创建新标签,而不是重复使用现有的那些。


    1. 这实际上取决于您是否要准确识别会员租用的设备(也许某些设备已损坏,您可以追踪租用该特定设备的每个人?)。如果您确实区分,那么每个项目将只是它自己的行。您还应该添加一个新列作为外部标识符,但不需要保留计数。

      如果对你来说都一样,那么我只会保留total,而不保留available。如果您保留了available 列,那么每当有内容登录EquipmentRentalHistory 时,您就必须不断更新它。如果表不同步,这会很烦人。您可以在EquipmentRentalHistory 中查询设备的Id,并计算returnedDate IS NULL 所在的条目以获取当前正在使用的设备数量


    补充说明

    如果您想更改到期日,最好在租赁历史记录中设置一个“到期日”列,而不是对日期计算进行硬编码。这样您还可以授予扩展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多