Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 具有可在不同地点之间移动的资产的预订系统的数据库设计_Database_Database Design - Fatal编程技术网

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)

现在,如果客户从位置A
IsCurrenReservation
中选择资产,则当他放弃时,位置B
IsCurrenReservation
仍然为真。现在,如果再次从位置B中拾取,则此项的
IsCurrenReservation
将为真,而以前的Entry的
IsCurrenReservation
将为假。现在在查询中,使用
IsCurrenReservation=true
将为您提供每个位置的当前资产数量。如果TolocationID为null且isCurrentServation=true,则将随时为您提供预订数量。这可能不是一个理想的解决方案,但看起来它会起作用

是的,我已经规范化了这些实体;但困难在于在不同地点的不同时间获得可用性。@stUrb只需计算在某个地点丢弃的资产数量减去在感兴趣时间之前从该地点捡到的资产数量。假设每个资产每天可预订15次。这意味着您有15个该资产的实例。您是在资产表中单独维护每个实例,还是在资产表中以可用实例数作为字段维护一个资产?我们有多个可用资产,可以在白天(甚至隔夜)出租。我们的标准是每个位置有3个可用资产。我不知道做什么是明智的。也许最好有一个表,每个资产都有可用性。在这里,每个资产只有一个预订。他可能和我在同一时间每个资产都有很多预订understand@Tassadaque使用Benny Hill的解决方案,每个资产在资产表中都会有自己的一行。@stUrb-我在保留表中添加了一些数据,并修改了查询只返回一个结果。@stUrb-I更新了SQL。很抱歉编辑,工作一直在打断我:-)通过添加
不同的
,我确保我们只会看到列出的每个资产一次,这是我在添加
限制时所想的(但显然是错误的!)。这确实应该做到!谢谢你的帮助!这听起来相当可靠和可行!非常感谢。