我正在开发一个数据库结构,其中包含在几个位置之间传输的资产。我想为这些资产建立预订系统。如果资产不在不同地点之间旅行,则很容易获得可用性:只需检查某一天的预订数量,并从通常可用的数量资产中减去它们。
available = Normal.Available - already reserved
但复杂因素是人们可以在不同地点之间旅行。客户可以在位置A取货,然后在位置B取货。例如9月13日上午10:00在LocB 9月13日13:00下车。
如果我现在想要在13:00获得位置B处的可用资产,则这是正常的可用数字+1,因为从A-> B行进的资产。显然,位置A的可用性比正常情况少一个。
如何在数据库结构中绘制这些动作?
实体很明确:资产,地点,预订和客户。困难在于在不同时间获得不同地点的可用性。
答案 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个实体:资产,位置,客户和预订。 使用“预订”显示客户从一个位置到另一个位置预订的资产的时间。