具有可在位置之间传输的资产的预订系统的数据库设计

时间:2013-09-13 20:13:04

标签: database database-design

我正在开发一个数据库结构,其中包含在几个位置之间传输的资产。我想为这些资产建立预订系统。如果资产不在不同地点之间旅行,则很容易获得可用性:只需检查某一天的预订数量,并从通常可用的数量资产中减去它们。

available = Normal.Available - already reserved

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

如果我现在想要在13:00获得位置B处的可用资产,则这是正常的可用数字+1,因为从A-> B行进的资产。显然,位置A的可用性比正常情况少一个。

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

3 个答案:

答案 0 :(得分:2)

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

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

有关散列密码的信息,请参阅PHP's crypt() function

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

答案 1 :(得分:1)

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

预订表将是

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

现在,ToLocation是实例的当前位置,您可以根据max(movementtime) group by AssetID获取位置明智的实例计数ToLocationID,如果资产正在传输中,它将为null

如果您每行维护一个资产,则没有实例表,那么AssetMovement表可能就像

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

现在,如果客户从位置选择资产,则IsCurrenReservation将为真,当他下降且位置B IsCurrenReservation仍然为真时。现在说它再次从位置B中挑选,然后IsCurrenReservation将为真,之前的肠IsCurrenReservation将为假。现在,使用IsCurrenReservation= true查询将为您提供每个位置的当前资产数量。如果TolocationID为null且IsCurrentReservation = true,则会随时为您提供预订次数。这可能不是一个理想的解决方案,但看起来会起作用

答案 2 :(得分:0)

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