使用关系数据库跟踪库存随时间和空间的移动

时间:2011-03-30 20:37:56

标签: mysql sql database-design

作为我正在设计的鱼类库存系统的一部分,我必须追踪鱼的位置。我需要能够显示实例数据 - 即上周一坦克3中有14只鲑鱼,坦克5中有17只红鱼。而且我需要能够显示监管链 - 即在2000年5月4日20只绿鱼到达之后,5只去了tank3,15只去了tank2。 6月3日10日从tank2搬到了tank5。

如果我存储鱼数和计数日期,那么实例数据很容易,无需进行计算。

如果我存储鱼的增量/减量和转移日期,则必须计算实例数据。从好的方面来说,用户输入他们知道的数字(他们移动了多少条鱼)而不是他们不知道的数字(鱼的总数/位置数)。

使用这些选项中的任何一个都必须推断出监管链(例如5月2日12:01时5只红鱼离开2号鱼缸,3只红鱼在相同(或非常接近)的时间到达油罐7。因此这3只红鱼来自坦克2)。这似乎很容易出错。

所以,这意味着我需要存储监管链。其中哪一个(或另一个模型完全!)会更好用?

CREATE TABLE  fish_transfers(
    transfer_id INT unsigned NOT NULL auto_increment PRIMARY KEY,
    fishtype_id INT unsigned NOT NULL,
    tank_id INT unsigned NOT NULL,
    from_tank INT unsigned, //can be null if this is the first tank
    to_tank INT unsigned, //can be null if this is the last tank
    fish_count INT unsigned NOT NULL,  //current count
    count_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP)

OR

CREATE TABLE  fish_transfers(
    transfer_id INT unsigned NOT NULL auto_increment PRIMARY KEY,
    fishtype_id INT unsigned NOT NULL,
    tank_id INT unsigned NOT NULL,
    target_tank INT unsigned,   //can be null if this is the first or last tank
    transfer_count INT NOT NULL,  //increment or decrement
    transfer_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP)
    //target tank is known to be after current tank if transfer_count is negative and before current tank if transfer_count is positive

2 个答案:

答案 0 :(得分:2)

提案(看起来像是您的第一个解决方案):

CREATE TABLE  fish_transfers(
    transfer_id INT unsigned NOT NULL auto_increment PRIMARY KEY,
    fishtype_id INT unsigned NOT NULL,
    source_tank_id INT unsigned,  // can be null if this is the first tank
    target_tank_id INT unsigned,  // can be null if this is the last tank
    transfer_count INT NOT NULL,  // always positive (amount of fishes transferred)
    transfer_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP)

答案 1 :(得分:2)

@ frosty-z提供的解决方案确实是更好的解决方案,但我认为我应该添加解释原因:

这是一个更好的选择的原因是它很简单:转移的所有相关数据都包含在一个记录中,因此很容易理解发生了什么。您建议的第二个解决方案不太好,因为它需要通过查看多个记录进行推断。 KISS。