2

我正在开发一个数据库结构,它由在几个位置之间移动的资产组成。我想为这些资产做一个预订系统。如果资产不在不同位置之间移动,则很容易获得可用性:只需检查某一天存在多少预订,然后从通常可用的资产数量中减去它们。

available = Normal.Available - already reserved

但复杂的因素是人们可以在不同地点之间旅行。客户可以在位置 A 提取资产并在位置 B 放下资产。例如,在 9 月 13 日上午 10:00 取货,并在 9 月 13 日 13:00 在 LocB 下车。

如果我现在想在 13:00 在位置 B 拥有可用资产,这是正常的可用数字 +1,因为资产从 A->B 移动。显然,位置 A 的可用性比正常情况少一倍。

如何在数据库结构中绘制这些运动?
实体很明确:资产、位置、预订和客户。困难在于在不同时间在不同地点获得可用性。

4

3 回答 3

2
assets
    id              unsigned int(P)
    description     varchar(200)

+----+-------------+
| id | description |
+----+-------------+
|  1 | Widget A    |
| .. | ........... |
+----+-------------+

请参阅PHP 的 crypt() 函数以对密码进行哈希处理。

customers
    id              unsigned int(P)
    first_name      varchar(50)
    middle_name     varchar(50) // Allow NULL
    last_name       varchar(50)
    email           varchar(255)
    username        varchar(32)
    password        varbinary(255) // hashed
    ...

+----+------------+-------------+-----------+----------------------------+-----------+----------+-----+
| id | first_name | middle_name | last_name | email                      | username  | password | ... |
+----+------------+-------------+-----------+----------------------------+-----------+----------+-----+
|  1 | John       | Quincy      | Public    | jqp@privacy.com            | johnqball | xxxxxxxx | ... |
|  2 | Jane       | NULL        | Doe       | ladyinred@chrisdeburgh.com | janeykins | xxxxxxxx | ... |
| .. | .......... | ........... | ......... | .......................... | ......... | .......  | ... |
+----+------------+-------------+-----------+----------------------------+-----------+----------+-----+

locations
    id              unsigned int(P)
    description     varchar(200)

+----+-------------+
| id | description |
+----+-------------+
|  1 | Facility A  |
|  2 | Facility B  |
| .. | ........... |
+----+-------------+

reservations
    id              unsigned int(P)
    asset_id        unsigned int(F assets.id)
    customer_id     unsigned int(F customers.id)
    from_id         unsigned int(F locations.id)
    to_id           unsigned int(F locations.id)
    beg             datetime
    end             datetime

+----+-------------+----------+---------+-------+---------------------+---------------------+
| id | customer_id | asset_id | from_id | to_id |         beg         |         end         |
+----+-------------+----------+---------+-------+---------------------+---------------------+
|  1 |           1 |        1 |       1 |     2 | 2013-09-13 03:00:00 | 2013-09-13 14:00:00 |
|  1 |           1 |        1 |       2 |     1 | 2013-09-14 19:00:00 | 2013-09-15 07:00:00 |
|  1 |           1 |        1 |       1 |     2 | 2013-09-15 10:00:00 | 2013-09-15 17:00:00 |
|  1 |           1 |        1 |       2 |     1 | 2013-09-16 08:00:00 | 2013-09-16 13:00:00 |
|  1 |           1 |        1 |       1 |     2 | 2013-09-17 10:00:00 | 2013-09-17 17:00:00 |
| .. | ........... | ........ | ....... | ..... | ................... | ................... |
+----+-------------+----------+---------+-------+---------------------+---------------------+

要了解设施 A 现在有什么可用的:

SELECT DISTINCT asset_id, * FROM reservations
WHERE to_id = 1 AND
    beg > NOW()
ORDER BY beg, end

要了解明天 15:00 在设施 B 有什么可用的:

$target_datetime = '2013-09-14 15:00:00';
SELECT DISTINCT asset_id, * FROM reservations
WHERE to_id = 2 AND
    beg > $target_datetime
ORDER BY beg, end
于 2013-09-13T20:46:57.427 回答
1

如果您将每个资产可用性维护为资产实例,那么您可以创建一个表AssetInstances(AssetInstanceID,AssetID)

预订表将是

AssetMovement(AssetInstanceID, FromLocationID,ToLocationID,StartMovementTime,EndMovementTime,CustomerID)

现在 ToLocation 是实例的当前位置,max(movementtime) group by AssetID ToLocationID如果资产在运输中,您可以获得基于位置的实例计数将为空

如果您每行维护一项资产,则没有实例表,则 AssetMovement 表可能类似于

AssetMovement(AssetID, FromLocationID,ToLocationID,StartMovementTime,EndMovementTime,CustomerID,IsCurrentReservation)

现在,如果客户从位置 A 拾取资产IsCurrenReservation将是真实的,并且当他放下时,位置 BIsCurrenReservation仍然是真实的。现在说它是从位置 B 再次挑选出来的,那么IsCurrenReservation这将是真的,而之前的输入IsCurrenReservation将是假的。现在查询IsCurrenReservation= true将为您提供每个位置的当前资产数量。如果 TolocationID 为 null 并且 IsCurrentReservation=true 将随时为您提供预订数量。这可能不是一个理想的解决方案,但看起来它会起作用

于 2013-09-13T20:50:26.247 回答
0

我看到的是 4 个实体开始:资产位置客户预订。使用预订显示客户从一个位置到另一个位置预订什么资产的时间。

于 2013-09-13T20:21:23.747 回答