Database 具有可在不同地点之间移动的资产的预订系统的数据库设计
我正在开发一个数据库结构,它由在两个位置之间移动的资产组成。我想为这些资产建立一个预订系统。如果资产不在不同地点之间移动,很容易获得可用性:只需检查某一天有多少预订,并从正常可用的资产数量中减去即可Database 具有可在不同地点之间移动的资产的预订系统的数据库设计,database,database-design,Database,Database Design,我正在开发一个数据库结构,它由在两个位置之间移动的资产组成。我想为这些资产建立一个预订系统。如果资产不在不同地点之间移动,很容易获得可用性:只需检查某一天有多少预订,并从正常可用的资产数量中减去即可 available = Normal.Available - already reserved 但复杂的因素是人们可以在不同的地点之间旅行。客户可以在位置A提取资产,然后在位置B将其丢弃。例如,9月13日上午10:00提取9月13日上午13:00在LocB下车 如果我现在想在13:00时在位置B拥
available = Normal.Available - already reserved
但复杂的因素是人们可以在不同的地点之间旅行。客户可以在位置A提取资产,然后在位置B将其丢弃。例如,9月13日上午10:00提取9月13日上午13:00在LocB下车
如果我现在想在13:00时在位置B拥有可用资产,这是正常可用数字+1,因为资产从A->B移动。显然,位置A的可用性比正常低一
如何在数据库结构中绘制这些移动的图形?实体是明确的:资产、地点、预订和客户。困难在于在不同的时间获得不同地点的可用性。我看到的是从4个实体开始:资产,地点,客户和预订。 使用“预订”显示客户从一个地点到另一个地点预订资产的时间
assets
id unsigned int(P)
description varchar(200)
+----+-------------+
| id | description |
+----+-------------+
| 1 | Widget A |
| .. | ........... |
+----+-------------+
有关对密码进行哈希处理的信息,请参阅
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
如果将每个资产可用性维护为资产实例,则可以创建一个表
AssetInstances(AssetInstanceID,AssetID)
预定的桌子是空的
AssetMovement(AssetInstanceID, FromLocationID,ToLocationID,StartMovementTime,EndMovementTime,CustomerID)
现在ToLocation是实例的当前位置,您可以根据AssetID获得基于max(movementtime)group的位置相关实例计数ToLocationID
如果资产在运输过程中将为空
如果您每行维护一个资产,并且没有实例表,那么AssetMovement表可能如下
AssetMovement(AssetID, FromLocationID,ToLocationID,StartMovementTime,EndMovementTime,CustomerID,IsCurrentReservation)
现在,如果客户从位置AIsCurrenReservation
中选择资产,则当他放弃时,位置BIsCurrenReservation
仍然为真。现在,如果再次从位置B中拾取,则此项的IsCurrenReservation
将为真,而以前的Entry的IsCurrenReservation
将为假。现在在查询中,使用IsCurrenReservation=true
将为您提供每个位置的当前资产数量。如果TolocationID为null且isCurrentServation=true,则将随时为您提供预订数量。这可能不是一个理想的解决方案,但看起来它会起作用是的,我已经规范化了这些实体;但困难在于在不同地点的不同时间获得可用性。@stUrb只需计算在某个地点丢弃的资产数量减去在感兴趣时间之前从该地点捡到的资产数量。假设每个资产每天可预订15次。这意味着您有15个该资产的实例。您是在资产表中单独维护每个实例,还是在资产表中以可用实例数作为字段维护一个资产?我们有多个可用资产,可以在白天(甚至隔夜)出租。我们的标准是每个位置有3个可用资产。我不知道做什么是明智的。也许最好有一个表,每个资产都有可用性。在这里,每个资产只有一个预订。他可能和我在同一时间每个资产都有很多预订understand@Tassadaque使用Benny Hill的解决方案,每个资产在资产表中都会有自己的一行。@stUrb-我在保留表中添加了一些数据,并修改了查询只返回一个结果。@stUrb-I更新了SQL。很抱歉编辑,工作一直在打断我:-)通过添加不同的,我确保我们只会看到列出的每个资产一次,这是我在添加限制时所想的(但显然是错误的!)。这确实应该做到!谢谢你的帮助!这听起来相当可靠和可行!非常感谢。