停车场数据库设计

时间:2013-07-31 09:32:51

标签: mysql database database-design

我们在停车场的入口和出口处有两个车牌阅读器摄像头,当检测到时会生成一个CSV文件,然后自动加载到数据库中,以及自动进入的入口屏障通过相机的“白名单”,然后从数据库中生成和控制并导出到文本文件中。

最初,根据下面的设计,我认为这将是一个简单的3表数据库,但我很快意识到情况并非如此:

我最初的设计:

tbl_in :      ID (autonum/PK), Plate, Date_in, Time_in    
tbl_out:      ID (Autonum/PK), Plate, Date_out, Time_out    
tblwhitelist: Plate(PK), Country Code, Description

目前,我能想到的唯一关系是:

白名单板 - Plate_in& plate_out 其中白名单中的一个板可以在内部和外部多次看到。出桌


这已经变得更加复杂了(这是我的大脑真正融化的地方!)已经指定的查询(括号显示列和基本逻辑正在考虑结果):

  1. “今日白色车辆”(IF版位于白名单:平板,描述,Time_in,Time_out [如果今天在OUT表上看到的板,否则为空])
  2. “今天看到的非白名单车辆”(IF板不在白名单上:板块,Time_in,Time_out [如果在OUT表上看到板块,否则为空])
  3. “白名单车辆现场时间为今天/过去7天/过去30天/过去90天(白名单上的IF板:板块,描述,日期_in,时间_in,日期_输出,时间_输出)在网站上多次重复使用相同的牌照
  4. “今天/最近7天/过去30天/过去90天内非白名单车辆现场时间(IF板未列入白名单:Plate,Date_in,Time_in,Date_out,Time_out)将在现场多次重复相同印版的条目
  5. 我真正需要帮助的是关于如何整理查询代码以使这些正常工作的一些想法。这是我在这个项目中的最后一个主要障碍之一。不幸的是,这是珠穆朗玛峰的一个障碍。非常感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:0)

我同意Straweberry的帖子,inout不需要两个表格。你可以有一个像:

 tblVehicleEvent : ID (autonum/PK), Plate, EventDate, EventTime, EventType

其中EventType的值为 IN OUT

或者您可以将TimeIn和TimeOut以及DateIn和DateOut合并为:

 tblVehicleEvent : ID (autonum/PK), Plate, DateIn, DateOut, TimeIn, TimeOut

我认为第二个更容易根据您的要求进行查询。

查询如下:

  1. 今日白色车辆现场“(IF板块在白名单上: Plate,Description,Time_in,Time_out [如果在OUT表上看到的板 今天,否则为null])

    SELECT W.Plate,Description,TimeIn,TimeOut FROM tblVehcileEvent V
      INNER JOIN tblWhitelist W
      ON V.Plate = W.Plate
      WHERE DateIn = curdate()

  2. “今天看到的非白名单车辆”(IF版不在白名单上: Plate,Time_in,Time_out [如果在OUT表上看到板,否则 空])

    SELECT Plate,TimeIn,TimeOut
     从tblVehicleEvent
     板块不在(从TblWhitelist选择板块)

  3. “白名单车辆在今天/过去7天/过去30天的现场时间 天/最近90天(白名单上的IF板块:板块,描述, Date_in,Time_in,Date_out,Time_out)这将有重复 在现场多次进行相同板块的条目

    SELECT W.Plate,Description,TimeIn,TimeOut
      来自tblVehcileEvent V
      INNER JOIN tblWhitelist W
      ON V.Plate = W.Plate
      在哪里DateIn BETWEEN startDate和EndDate

  4. “非白名单车辆在今天/过去7天/过去30天的现场时间 天/最近90天(IF版不在白名单上:Plate,Date_in, Time_in,Date_out,Time_out)这将有重复的条目 在现场多次使用相同的板材

    SELECT Plate,TimeIn,TimeOut
      从tblVehicleEvent
      盘子不在(从TblWhitelist选择板)
      AND DateIn BETWEEN startDate和EndDate

答案 1 :(得分:0)

像草莓建议的那样,使用一张桌子,每张记录跟踪车辆在公园内的完整停留时间。

tbl_stay

ID (autonum/PK), Plate, Date_in, Time_in, Date_out, Time_out

如果您使用两个不同的表,则必须执行复杂查询以关联数据。是什么告诉您tbl_in中的一行与tbl_out中的另一行相关?你必须比较板号并找到最接近Date_in / Time_in的Date_out / Time_out ......

所以只使用一个表,但不要使用Edper的第一个建议,你最终会遇到同样的问题,这次根据事件类型过滤表并尝试将一行与另一行相关联。

我认为您的第一个查询看起来像这样:

SELECT *
FROM tbl_whitelisted
INNER JOIN tbl_stay
ON tbl_whitelisted.Plate = tbl_stay.Plate
WHERE tbl_stay.Date_in <= curdate()
AND (tbl_stay.Date_out IS NULL OR tbl_stay.Date_out = curdate())

第二个将是:

SELECT *
FROM tbl_stay
WHERE tbl_stay.Date_in <= curdate()
AND (tbl_stay.Date_out IS NULL OR tbl_stay.Date_out = curdate())
AND tbl_stay.Plate NOT IN (SELECT Plate FROM tbl_whitelist)

或者也许这(今天“看到”的意思是什么?我想这意味着今天至少扫描过一次车辆的车牌,所以前面的版本不会这样做,因为它也会返回现在仍在现场的车辆,但是那是昨天来的......)

SELECT *
FROM tbl_stay
WHERE (tbl_stay.Date_in = curdate() OR tbl_stay.Date_out = curdate())
AND tbl_stay.Plate NOT IN (SELECT Plate FROM tbl_whitelist)