首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停车场数据库设计

停车场数据库设计
EN

Stack Overflow用户
提问于 2013-07-31 09:32:50
回答 2查看 2K关注 0票数 1

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

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

我的初步设计:

代码语言:javascript
复制
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

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

白名单板块-板块_ in & plate_out,在这里,可以在输入和输出表中多次看到白名单中的一个板块

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

  1. “今日现场白色车辆”(如果车牌在白名单上:板块,描述,Time_in,Time_out,如果今天在桌子上看到的话,否则无效)
  2. “今天看到的非白名单车辆”(如果车牌不在白名单上:板块,Time_in,Time_out,如果板块出现在表外,否则为空)
  3. “今日/最后七天/最后三十天/最后九十天内车辆在现场的时间(如白名单上的车牌:牌照、描述、Date_in、Time_in、Date_out、Time_out)
  4. “非白名单车辆今日/最后7天/最后30天/最后90天(如车牌不在白名单上:板块、Date_in、Time_in、Date_out、Time_out)将在现场多次重复输入相同的车牌。

我真正需要帮助的是关于如何整理查询代码以使这些代码正常工作的一些想法。这是我在这个项目中最后的主要障碍之一。不幸的是,这是珠穆朗玛峰那么大的障碍。如果您能提供任何帮助,我们将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-31 09:47:59

我同意草莓的帖子,inout不需要两张桌子。你可以有一个这样的:

代码语言:javascript
复制
 tblVehicleEvent : ID (autonum/PK), Plate, EventDate, EventTime, EventType

其中EventType的值为INOUT

或者可以合并TimeIn和TimeOut以及DateIn和DateOut,比如:

代码语言:javascript
复制
 tblVehicleEvent : ID (autonum/PK), Plate, DateIn, DateOut, TimeIn, TimeOut

根据您的需求,我认为后面的查询会更容易。

这些查询如下:

  1. “(如果车牌在白名单上:板块,描述,Time_in,Time_out,如果在今天的桌子上看到的话,否则无效) 从W.Plate V中选择TimeOut、Description、TimeIn、TimeOut 内连接tblWhitelist W 关于V.Plate = W.Plate 其中DateIn = curdate()
  2. “非白名单车辆今日所见”(如车牌不在白名单上:车牌、Time_in、Time_out如在表外,则为空) 选择板块,TimeIn,TimeOut 来自tblVehicleEvent 版材不在的地方(从tblWhitelist中选择板块)
  3. “今日/最后七天/最后三十天/最后九十天(如白名单上的车牌:车牌、描述、Date_in、Time_in、Date_out、Time_out)的车辆在工地上的时间会重复多次。” 选择W.Plate,Description,TimeIn,TimeOut 来自tblVehcileEvent V 内连接tblWhitelist W 关于V.Plate = W.Plate 其中DateIn在startDate和EndDate之间
  4. “非白名单车辆今日/最后七天/最后三十天/最后九十天(如车牌不在白名单上:板块、Date_in、Time_in、Date_out、Time_out),在现场多次重复输入相同的车牌。” 选择板块,TimeIn,TimeOut 来自tblVehicleEvent 版材不在的地方(从tblWhitelist中选择板块) 和DateIn在startDate和EndDate之间
票数 0
EN

Stack Overflow用户

发布于 2013-07-31 09:58:43

就像草莓建议的那样,用一张桌子记录一辆车在公园里的全部停留时间。

代码语言:javascript
复制
tbl_stay

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

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

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

我认为您的第一个查询应该是这样的:

代码语言:javascript
复制
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())

第二种情况是:

代码语言:javascript
复制
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)

或者这个(今天的“看到”意味着什么?我想这意味着这辆车的车牌今天至少被扫描过一次,所以之前的版本不会被扫描,因为它还会返回今天还在现场的车辆,但是昨天才收到的。)

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17966679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档