是否可以规范化表,以便它可以在一行中包含一个值?

时间:2015-06-07 07:03:44

标签: mysql

我有一个包含三列BusNo,BusRoute& amp; BusStop,其中BusStop列包含多个逗号分隔值。我想对它进行规范化,以便表格在一行中包含一个句点。实施例

BusNo  BusRoute                BusStop  
1      Rajendra Nagar to Noida Apsara,Shahadara,Shakarpur,Mother Dairy 

我想在多行中停止它是不是很好的方法我在这里有更多的1000 BusNo。

3 个答案:

答案 0 :(得分:1)

我的建议是有两个新表:BusStopsBusRouteBusStops

BusStops每个公交车站都有一行,至少包含两列:StopNumberStopNameBusRouteBusStops将是将BusRoute表与BusStops表相关联的表。此表格中的每一行都有一个来自BusRoutesBusStops的主键。

这个想法是将公交车停在一张桌子上,无论他们是否以及在何处使用。这样你可以在你想要的许多路线中使用一站式。此外,如果您决定从所有路线中删除一个停靠点,它仍然保留并可用于新路线。 如果您想在路线中表示公交车站的订单,可以将其作为列添加到BusRouteBusStops表中。

表示例:

Table BusRoutes - primary-Key(BusNo)
===============
BusNo | BusRoute
1     | Rajendra Nagar to Noida

Table BusStops - primary-Key(StopNumber)
===============
StopNumber | StopName
1          | Apsara
2          | Shahadara
3          | Shakarpur
4          | Other Stop
5          | Mother Dairy

Table BusRouteBusStops - primary-Key(BusNo+StopNumber)
===============
BusNo | StopNumber | stpoOrder
1     | 1          | 1
1     | 2          | 2
1     | 3          | 3
1     | 5          | 4

使用MySql语法获取通过给定停靠点(例如:Apsara)的所有总线编号的查询将是:

SELECT BR.* 
FROM BusRoutes BR, BusStops BS, BusRouteBusStops BRBS
WHERE BR.BusNo=BRBS.BusNo
AND BS.StopNumber=BRBS.StopNumber
AND BS.StopName="Apsara"

答案 1 :(得分:0)

要解决m:n关系,通常使用其他表格。由于您现在拥有一张桌子中的所有内容,这意味着您需要另外两张桌子。

表格结构

bus_stop: id, name

bus_route: id, description

stop_to_route_relation: bus_route, bus_stop

实施例

bus_stop
--------------------
| id | name        |
--------------------
|  1 | CityA       |
--------------------
|  2 | CityB       |
--------------------
|  3 | CityC       |
--------------------

bus_route
-----------------------------
| id | bus_no | description |
-----------------------------
|  1 |  5     | CityA to B  |
-----------------------------
|  2 |  5     | CityA to C  |
-----------------------------

stop_to_route_relation
------------------------
| bus_route | bus_stop |
------------------------
|  1        |  1       |
------------------------
|  1        |  2       |
------------------------
|  2        |  1       |
------------------------
|  2        |  3       |
------------------------

示例查询

select 
    br.bus_no, 
    bs.name 
from 
    bus_route br 
left join stop_to_route_relation str on (br.id = str.bus_route) 
left join bus_stop bs on (str.bus_stop = bs.id);

答案 2 :(得分:-1)

如果要标准化BusStop字段,则需要为其创建一个新表。像这样:

Table: Bus
===================================
| BusNo | BusRoute                
===================================
| 1     | Rajendra Nagar to Noida 
===================================

Table: BusStop
--------------------------
| BusNo | BusStop        
--------------------------
| 1     | Apsara         
--------------------------
| 1     | Shahadara      
--------------------------
| 1     | Shakarpur      
--------------------------
| 1     | Mother Dairy   
--------------------------

在BusStop表中,BusNo是将其链接到总线表的外键。

你提到你有1000 BusNo所以我想它需要大量的资源,因为规范化它需要更多的行来为每个BusNo保存BusStop。例如,每个BusNo有5个BusStop,那么你的BusStop新表大约有1000 x 5行(你在表中保存每个BusStop of Bus)。我在这里看到的优点是你可以在规范化时做更多的查询。你在决定时权衡利弊。古德勒克。