我有一个包含三列BusNo,BusRoute& amp; BusStop,其中BusStop列包含多个逗号分隔值。我想对它进行规范化,以便表格在一行中包含一个句点。实施例
BusNo BusRoute BusStop
1 Rajendra Nagar to Noida Apsara,Shahadara,Shakarpur,Mother Dairy
我想在多行中停止它是不是很好的方法我在这里有更多的1000 BusNo。
答案 0 :(得分:1)
我的建议是有两个新表:BusStops
和BusRouteBusStops
。
BusStops
每个公交车站都有一行,至少包含两列:StopNumber
和StopName
。
BusRouteBusStops
将是将BusRoute
表与BusStops
表相关联的表。此表格中的每一行都有一个来自BusRoutes
和BusStops
的主键。
这个想法是将公交车停在一张桌子上,无论他们是否以及在何处使用。这样你可以在你想要的许多路线中使用一站式。此外,如果您决定从所有路线中删除一个停靠点,它仍然保留并可用于新路线。 如果您想在路线中表示公交车站的订单,可以将其作为列添加到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)。我在这里看到的优点是你可以在规范化时做更多的查询。你在决定时权衡利弊。古德勒克。