规范化数据库列

时间:2013-09-24 14:42:04

标签: mysql sql database-design database-normalization

此处的目标是能够查询为其提供旅程的数据库,根据旅程,数据库将返回所有停止代码贯穿这段旅程。

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

http://i.imgur.com/9ZBSxmq.png

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

enter image description here

您还可以看到第二个表,其中每个 STOP CODE 都有很多 JOURNEYS 作为父级。据我所知,将多个旅程放入单个字段并不遵循标准数据库设计,所以如果有人可以帮我修复,我会非常感激。

这些图片是在微软的Excel中拍摄的,只是为了计划我将如何做,生产将使用MySQL数据库。

由于

3 个答案:

答案 0 :(得分:5)

您在停止代码和旅程之间存在多对多关系。要根除这一点,你需要分解关系。

为了做到这一点,你需要一个中间表,我们称之为JourneyStopCode,它将如下所示:

JourneyStopCode:
JourneyStopCodeID (primarykey)
JourneyID
StopCodeID

然后您的停止代码表将没有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 |
----------------------------------------


StopCode

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


JourneyStopCode

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

答案 1 :(得分:3)

停止代码的旅程是一个多对多的关系,你最想要一个连接表。

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
);

答案 2 :(得分:0)

试试这个:

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

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

    TABLE 3
    -------
    JOURNEY SEQUENCENNO