【问题标题】:Choosing terms to insert into database that allows record to be queried easy later选择要插入数据库的术语,以便以后轻松查询记录
【发布时间】:2012-01-25 12:13:19
【问题描述】:

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

---------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------- 黑。没有 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 黑 88.35 |萨苏| 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|莫图我们 铬。 88.35 |194 / 159 | |194 / 159 | |194 / 159 | |194 / 159 | |239 关闭 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 个或更多空乘职位,具体取决于所飞行的飞机类型。

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

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

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

  • “CAFO”
  • “加拿大”
  • “FO”
  • “1”
  • “2”

现在我需要访问数据库并为我的网络程序检索这些记录。如果船长想要检索记录,他将只需要船长行,即“CAFO”或“CA”。副驾驶则相反。 当我进行查询时,我发现我可以使用 mySQL 命令 SUBSTRING 来获取前 2 个或后 2 个字符。

船长线

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

这只会从记录中获取前两个开始字符,并且会匹配两种情况。 对于一级军官,我从字符串的末尾开始并抓取最后两个字符。

SELECT Line_number,html_text FROM lines WHERE SUBSTRING(Crew_type,-2)="FO"

对于空乘人员,我可以比较这个数字。 如果空乘人员只想要 1 个位置的线路。

SELECT Line_number,html_text FROM lines WHERE Crew_type = "1"

或者如果他们想要所有可能的空姐职位

SELECT Line_number,html_text FROM lines WHERE Crew_type >= "1"

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

我的问题是有更好的方法来解决这个问题吗?我只会插入一次,但会检索很多。 SUBSTRING 命令是否会过多地减慢查询速度?

【问题讨论】:

    标签: mysql schema


    【解决方案1】:
    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 iw 中的某个地方会定义

    $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' 之一

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多