Mysql 停车场数据库设计

Mysql 停车场数据库设计,mysql,database,database-design,Mysql,Database,Database Design,我们在停车场的入口和出口处安装了两个车牌读取器摄像头,当检测发生时,该摄像头将生成一个CSV文件,然后自动加载到数据库中,同时在入口处安装了一个屏障,由摄像头的白名单自动操作,然后从数据库中生成和控制,并导出到文本文件中 起初,我认为这将是一个简单的3表数据库,如下所示,但我很快意识到情况并非如此: 我最初的设计: tbl_in : ID (autonum/PK), Plate, Date_in, Time_in tbl_out: ID (Autonum/PK), P

我们在停车场的入口和出口处安装了两个车牌读取器摄像头,当检测发生时,该摄像头将生成一个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
目前,我能想到的唯一关系是:

白名单板-板输入和板输出,其中白名单中的一个板可以在输入和输出表中多次看到

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

如果车牌在白名单上,则今天在现场的白名单车辆:车牌、说明、输入时间、输出时间[如果今天在输出表上看到车牌,否则为空] 如果车牌不在白名单上,则今天看到的非白名单车辆:车牌、输入时间、输出时间[如果车牌显示在输出表上,否则为空] 如果白名单上有标牌,则白名单车辆今天/过去7天/过去30天/过去90天在现场的时间:标牌、说明、输入日期、输入时间、输出日期、输出时间这将在现场多次重复输入相同标牌 未列入白名单的车辆今天/过去7天/过去30天/过去90天在现场的时间,如果车牌不在白名单上:车牌、日期\输入、时间\输入、日期\输出、时间\输出这将在现场多次重复输入同一车牌
我真正需要帮助的是关于如何整理查询代码以使其正常工作的一些想法。这是我在这个项目中最后的主要障碍之一。不幸的是,这是一个珠穆朗玛峰大小的障碍。如果您能提供任何帮助,我们将不胜感激

我同意斯特劳贝里的观点,你不需要两张桌子来进进出出。你可以有一个这样的:

 tblVehicleEvent : ID (autonum/PK), Plate, EventDate, EventTime, EventType
其中EventType的值为IN或OUT

或者您可以合并TimeIn和TimeOut以及DateIn和DateOut,如下所示:

 tblVehicleEvent : ID (autonum/PK), Plate, DateIn, DateOut, TimeIn, TimeOut
我认为第二种方法会更方便您以后根据您的要求进行查询

查询如下:

如果车牌在白名单上,则今天现场的白名单车辆: 铭牌、说明、输入时间、输出时间[如果在输出表上看到铭牌 今天,否则无效]

从tblVehcileEvent V中选择W板、说明、时间输入、超时 内连接tblWhitelist W 在V形板上=W形板 其中DateIn=curdate

如果车牌不在白名单上,则今天看到的非白名单车辆: 板,时间输入,时间输出[如果在输出表上看到板,否则 空]

选择板、时间输入、超时 从Tblehicleevent 如果板材不在tblWhitelist中,则从tblWhitelist中选择板材

白名单车辆今天/过去7天/过去30天的现场时间 天/过去90天,如果白名单上有铭牌:铭牌、说明、, 日期输入,时间输入,日期输出,时间输出这将是重复的 同一板材多次进入现场

选择W板、说明、时间输入、超时 来自tblVehcileEvent 内连接tblWhitelist W 在V形板上=W形板 其中DateIn介于startDate和EndDate之间

非白名单车辆今天/过去7天/过去30天的现场时间 天/最后90天,如果车牌不在白名单上:车牌,日期, Time\u in,Date\u out,Time\u out这将有重复的 现场多次使用同一板材

选择板、时间输入、超时 从Tblehicleevent 如果板材不在tblWhitelist中,则从tblWhitelist中选择板材 和日期介于开始日期和结束日期之间


就像草莓建议的那样,使用一个表格,每个记录跟踪车辆在公园的完整停留时间

tbl_stay

ID (autonum/PK), Plate, Date_in, Time_in, Date_out, Time_out
如果使用两个不同的表,则必须执行复杂的查询以关联数据。什么告诉你tbl_in中的一行与tbl_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())

我看不出有什么理由分门别类。我有一个这样的表:eventsplate*,datetime*,eventin或out,where*=PK的组件。我认为这可能会稍微简化问题的下一部分。如果使用后一个选项,则需要查看INSERT…on DUPLICATE KEY UPDATE。我可以看到这将如何工作,但这将如何影响我需要生成的查询?请检查我的查询@almg。谢谢。我要试一试。今天看到的确实是指板块
从摄像机上探测到的。这种方法会受到重复车牌的影响,例如:车辆离开站点然后稍后返回?那么您将有多行。如果您希望每辆车都有一行,只需使用SELECT DISTINCT Plate for Instance我正在努力解决这个问题,我遇到了另一个难题:将数据插入tbl_stay。除了我在问题中提到的主表之外,我还有两个缓冲表,仅用于导入CSV数据,然后使用自动ID主键将其插入主表。插入图版,日期和时间可以正常工作,但是日期和时间被转储到新的行中。我假设out数据的插入必须有一些条件来查看图版和/或表中out字段的内容?Date_out和Time_out的数据应该以tbl_stay结束的唯一方式是通过更新查询。您希望检索当前车牌的最近一行,并对其进行更改。例如,更新tbl_stay SET Date_out=,Time_out=其中Plate=按描述中的日期、描述限制1中的时间排序。或者,如果您对数据的完整性有信心,您可以更新Date_out和Time_out为空的行,逻辑上只有一个:update tbl_stay。。。如果Plate=和Date_out为空,Time_out为空,您也可以通过将所有曾经在停车场的车辆存储在一个新表中来简化此操作,该表有两列:tbl_车辆Plate PK,stay_id。当车辆进来时,您将在tbl_stay中插入一行,记住其PK,然后插入tbl_车辆Plate,stay_id值,在重复密钥更新时,保持_id=。因此,一辆你以前从未见过的车将获得新的一排,而一辆已经在表中的车将获得其停留id,该id指向当前停留。当您需要插入日期和时间时,只需查找该车牌的停留id即可。
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)