【问题标题】:How do you store quantities of items in an SQL database? (Postgresql)如何在 SQL 数据库中存储项目数量? (PostgreSQL)
【发布时间】:2017-05-10 15:59:36
【问题描述】:

我试图想出一种最直接的方法来将物品的数量存储在数据库中。我正在创建一个数据库以与我正在开发的 Web 应用程序结合使用,以监控和记录借给人们的装备。所以,我已经想到了几种不同的方法,尽管我不确定它们是否易于维护到未来。

想法 1

我有一个gear 表,其中存储了装备类型(例如衬衫、裤子、帽子)以及尺寸等数据。然后每次取出装备时,它都会记录在gear_inventory 表中,存储详细信息,例如用户 ID、齿轮类型和布尔值,以表示是否返回和返回日期。然后为了跟踪数量,我们将在gear 表中为特定装备项目提供总数量和装备数量,这是手动更新的,当一个项目被取出或返回到正负值时触发第二个查询数量。

想法 2

将上述总数量链接到gear_inventory,作为该类型所有未退货商品的计数。

想法 3

有一个更新任务来更改表更新或插入时的这些数量。然后通过增加或减少给定查询的数量来做同样的事情。

想法 1 是最简单的,但不如其他想法可靠。想法 2 是最可靠的数量处理是输入数据库以确保。那么 Idea 3 就没有那么可靠了,因为它仍然依赖于计划任务来更新它。

那么,您将如何实施数量数量以确保它不会与记录的库存记录不同步?

编辑 1

更多信息 - 我试图实现的核心解决方案是有一种方法来存储或计算取出的物品数量,该数量可以与与该物品关联的总数进行比较。如下所示,它将以与保龄球馆的借/借鞋类似的方式发挥作用,但将记录用户。因此,借用物品时将插入一条记录,并且该记录将在归还时更新归还日期。项目的类型将在其自己的表中存储一般项目的详细信息,并且与记录的齿轮表具有一对多的关系。问题是,什么是存储/检索项目数量的完整证明/可靠方式。或者我是否过度考虑了这一点,一个简单的计数查询就足够了,不确定当一次又一次地执行时计数的密集程度。

【问题讨论】:

  • 如果您能更多地谈论您要解决的问题而不是您提出的解决方案,这将更容易回答。似乎它将由一些直接的连接表处理,但很难弄清楚问题的参数。什么情况?你想用这些数据做什么?这像保龄球馆出租设备吗?
  • @Schwern 添加了更多信息,希望这就是您想要的。
  • 我认为想法 2 是最好的,因为您不太可能使用大数据并且不需要统计表。您可以创建名为gear_inventory_returned 的附加表并将记录从gear_inventory 移动到所述表中,这样会变得更小,更容易计数。

标签: sql database postgresql


【解决方案1】:

让我们想想我们正在跟踪什么。

  • 关于物品种类的信息。
  • 当前库存。
    • 哪个项目?
    • 有多少?
  • 借出的东西。
    • 给谁?
    • 哪些项目?
    • 有多少?
  • 退回的内容。
    • 由谁?
    • 哪些项目?
    • 有多少?

第一次剪辑可能看起来像这样:

create table items (
    id serial,
    name text,
    ...
);

create table inventory (
    id serial,
    item integer references items(id),
    quantity integer check(quantity >= 0)
);

create table loans (
    id serial,
    user integer references users(id),
    item integer references items(id),
    quantity integer check(quantity >= 0),
    when_loaned timestamp not null default now(),
    when_returned timestamp
);

当您借出一些东西时,在贷款中插入一行。当它返回时,设置loans.when_returned。如果loans.when_returned 为null,它仍然是out。

您可以在借出物品时减少库存,并在归还物品时增加库存。为了保持数据完整性,这应该作为触发器来完成,而不是作为计划进程。

或者,不要更改库存数量。相反,从库存量中减去借出物品的数量。那是来自select quantity from inventory where item = ?select sum(quantity) from loans where item = ? and when_returned is null。这使得贷款和退货更简单,并且避免了库存盘点被破坏的可能性,但是如果有很多很多未偿还的贷款,它可能会出现成本性能问题。


如果您借出 5 件物品而他们归还 3 件会怎样?你如何追踪它?一个简单的选择是将单笔贷款分成两笔贷款。

-- Copy the loan row
insert into loans
select * from loans where id = :orig_id

-- Track that 3 were returned
update loans
set quantity = 3, returned = now()
where id = :orig_id

-- Two are now outstanding
update loans
set quantity = 2
where id = :new_id

在不知道您使用它的目的、用例是什么以及规模有多大的情况下,我只能这么说。这是一个很好的起点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多