【问题标题】:Normalizing a database column规范化数据库列
【发布时间】:2013-09-24 14:42:04
【问题描述】:

这里的目标是能够查询一个提供旅程的数据库,根据旅程,数据库将返回所有停止代码 贯穿整个旅程。

因此,例如,我需要能够说“选择经过旅程 34 的所有停止代码”。这应该只返回 STOP CODE: SZDASDASDE。 (在生产中将返回更多代码)。

您可以在上面看到数据库中第一个表的图像。

您还可以看到第二个表,其中每个 STOP CODE 都有许多 JOURNEYS 作为父级。据我所知,将多个旅程放入一个领域并不遵循标准的数据库设计,所以如果有人能帮我解决这个问题,我将不胜感激。

这些图像是在 Microsoft 的 Excel 中拍摄的,只是为了计划我将如何执行此操作,生产将使用 MySQL 数据库。

谢谢

【问题讨论】:

  • 规范化,规范化,规范化
  • 因此在标题中使用“规范化” ;)

标签: mysql sql database-design database-normalization


【解决方案1】:

停止代码和旅程之间存在多对多关系。要消除这种情况,您需要分解关系。

为此,您需要一个中间表,我们称之为 JourneyStopCode,如下所示:

JourneyStopCode:
JourneyStopCodeID (primarykey)
JourneyID
StopCodeID

那么您的 Stop Code 表将没有 JourneyID 字段。

要检索旅程的停靠点代码,您可以:

SELECT * FROM StopCode
INNER JOIN JourneyStopCode ON StopCode.StopCodeID = JourneyStopCode.StopCodeID
INNER JOIN Journey On Journey.JourneyID = JourneyStopCode.JourneyID
WHERE JourneyID = @yourJourneyID

编辑:可视化:

---------------        ---------------------         ----------------
|  Journey    |        | JourneyStopCode   |         |  StopCode    |
---------------        ---------------------         ----------------
| JourneyID   |<---    | JourneyStopCodeID |     --->|  StopCodeID  |
| Description |   |----| JourneyID         |     |   |  Latitude    |
---------------        | StopCodeID        |------   |  Longitude   |
                       ---------------------         ----------------


那么您的数据将如下所示:

旅程

----------------------------------------
| JourneyID | Description              | 
----------------------------------------
| 34        | Southampton - Portsmouth |
----------------------------------------


停止代码

----------------------------------------
| StopID | Latitude | Longitude        | 
----------------------------------------
| SSDAFS | 12345    | 67890            |
----------------------------------------


JourneyStopCode

------------------------------------------
| JourneyStopID | JourneyID | StopCodeID | 
------------------------------------------
| 1             | 34        | SSDAFS     |
------------------------------------------

【讨论】:

  • 感谢您的回答。你是在建议我只需要一张桌子吗?如果您能为我形象化您的答案,我将不胜感激,我对数据库设计非常了解,并且正在努力理解您的答案(这可能是正确的)
  • @JoelKidd 没问题!它基本上只是一个可以用作主键的虚拟列,因为您不能将其他字段之一用作主键(但是您可以将它们都用作复合键,但我们不要那样做远的 :))。如果您不想在表中使用主键,则可以将其删除,但拥有一个主键始终是最佳做法。
  • @mattytommo - Malcolm Birtle 会很自豪的。
  • @mattytommo - ta。哈哈是的哦!安妮特希望你使用左反半连接
  • @DarrenDavies 哈哈,我打电话给雷吉讨论这个问题,他说我需要一个元素表。
【解决方案2】:

Journeys to stop code 是多对多关系,您最有可能需要一个连接表。

Table 1 :
SID   |   Stop Code   |  Long    |   lat 
0     | ASDFSAFA      | 1        | 2
1     | sdDSGSDGS     | 4        | 0 
....

Table 2 : 
Journey   | Description 
0         | Blah blah blah


Table 3 : 
Journey  | SID 
0        |  1
2        |  1
1        |  4


SELECT A.Longitude, A.Latitude FROM TABLE1 WHERE A.SID IN (
    SELECT SID FROM TABLE3 WHERE JOURNEY = 0
);

【讨论】:

  • 除非停止代码更改,否则它们可以作为 PK 使用。
  • 您能否显示一个 SQL 查询,该查询将返回行程经过的所有站点的纬度和经度值,例如 0?
  • 当然,使用子查询非常简单。我已将其添加到我的答案中。
【解决方案3】:

试试这个:

    TABLE 1
    -------
    JOURNEY (PK) DESCRIPTION

    TABLE 2
    -------
    SEQUENCENO (PK) STOP_CODE LATITUDE LONGITUDE

    TABLE 3
    -------
    JOURNEY SEQUENCENNO 

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 2012-10-08
    • 2012-06-21
    相关资源
    最近更新 更多