选择要插入数据库的术语,以便稍后查询记录

时间:2011-12-21 17:38:18

标签: mysql schema

我有一个文本文件,我每月解析并将数据插入我的数据库。文本文件如下所示。

------------------------------------------------------------------------------------------------------------------------------------------------------------
BLK. NO 410              | 1   2|  3   4   5   6   7 | 8   9| 10  11  12  13  14 |15  16| 17  18  19  20  21 |22  23| 24  25  26  27  28 |29  30| 31   1   2
          BLK   88.35    |SA  SU| MO  TU  WE  TH  FR |SA  SU| MO  TU  WE  TH  FR |SA  SU| MO  TU  WE  TH  FR |SA  SU| MO  TU  WE  TH  FR |SA  SU| MO  TU  WE
          CR.   88.35           |194   / 159         |      |194   / 159         |      |194   / 159         |      |194   / 159         |      |239        
          OFF      14      :   : VER DFW TRC DFW   X   :   : VER DFW TRC DFW   X   :   : VER DFW TRC DFW   X   :   : VER DFW TRC DFW   X   :   : CUU DFW    
C/O 06.00 TAFB 216.15   194=/1410/1055/0740, 159=/0900/1700/1400, 239=/1845/1945/0155
EM3 25.55 ERD 42.00 EM4 20.40 
-----------------------------------------------------------------------------------------------------------------------------

此文本文件包含100到300条记录(我们将其称为“飞行线”),我用它来确定每个月的航班时刻表。我正在解析这个文件很好,但该公司增加了一个新的皱纹。

这条“线”可以是飞行员或空乘人员。直到最近,每条线路都可以用于上尉或副驾驶。但是现在有些文件有队长和副队长。空乘人员档案可能有1或2个空乘人员位置或更多,具体取决于飞行的飞机类型。

我需要在我的数据库中创建一个反映这些新信息的新列。将行保存到数据库后,只会搜索它们,而不会再次更新。我不想添加新表只是为了跟踪这些信息。我想在现有表中添加一个新列。这是我的策略。

当我解析文本文件时,我会跟踪可用的位置。如果是Captain,我会将“CA”保存到数据库中。如果是副驾驶,我将保存“FO”。如果是船长和副驾驶,我将保存“CAFO”。对于乘务员,我将为1名空乘人员保存一个“1”号码。对于每个额外的poistion,我只会增加一个数字。如果更大的aiplanes需要更多乘务员的话,这将允许以后扩展。

回顾一下,我将为每个数据库记录保存以下内容。

  • “CAFO”
  • “CA”
  • “FO”
  • “1”
  • “2”

现在我需要访问数据库并检索我的Web程序的这些记录。如果船长想要检索记录,他将只想要“CAFO”或“CA”的船长线。对于第一批军官来说恰恰相反。 当我进行查询时,我发现我可以使用mySQL命令SUBSTRING来获取前2个或后2个字符。

为队长线

  

SELECT Line_numberhtml_text FROM lines WHERE SUBSTRING(Crew_type,1,2)=“CA”

这只会从记录中获取前两个开头字符,它将匹配两种情况。 对于第一批人员,我从字符串末尾开始,抓住最后两个字符。

  

SELECT Line_numberhtml_text FROM lines WHERE SUBSTRING(Crew_type, - 2)=“FO”

对于乘务员,我可以比较一下这个号码。 如果空乘人员只想要1个位置的线路。

  

SELECT Line_numberhtml_text FROM lines WHERE Crew_type =“1”

或者,如果他们想要所有可能的乘务员职位

  

SELECT Line_numberhtml_text FROM lines WHERE Crew_type> =“1”

我会使用上面列出的值将列类型设置为ENUM。

我的问题是有更好的方法来解决这个问题吗?我只会插入一次,但会进行很多修复。 SUBSTRING命令会不会太慢查询查询?

1 个答案:

答案 0 :(得分:0)

SELECT Line_number,html_text FROM lines WHERE SUBSTRING(Crew_type,1,2)="CA"

将成为性能杀手,因为它计算所有记录的子字符串,而不仅仅是那些使用的记录。你想要

SELECT Line_number,html_text FROM lines Crew_type in ("CA", "CAFO")

与FO同上。

所以PHP中的某个地方会定义

$matches=array(
  'CA'=>'"CA","CAFO"',
  'FO'=>'"FO","CAFO"',
  'FA'=>'"1","2"'
);

然后使用

$match=$matches[$crew_type];
$sql="SELECT Line_number,html_text FROM lines Crew_type in ($match)";

$ crew_type是'CA','FO','FA'之一