2010-05-30 138 views
0

我在我的應用程序中成功實現了以下架構。應用程序將桌面單元通道連接到IO單元通道。 DeskUnits和IOUnits表格基本上只是桌面/ IO單元的列表以及每個單元的通道數量。例如,一張桌子可以是4或12個頻道。實現與SQLite的一對多關係

CREATE TABLE DeskUnits (Name TEXT, NumChannels NUMERIC); 
CREATE TABLE IOUnits (Name TEXT, NumChannels NUMERIC); 

CREATE TABLE RoutingTable (DeskUnitName TEXT, DeskUnitChannel NUMERIC, IOUnitName TEXT, IOUnitChannel NUMERIC); 

然後,路由表「表」將每個DeskUnit通道連接到一個IOUnit通道。例如,DeskUnit名爲「分享幫助」頻道5月1日的路線IOunit名「IOUnit1」頻道2等

到目前爲止,我希望這是非常簡單易懂。然而,問題是嚴格的1對1關係。任何DeskUnit頻道都只能路由到1個IOUnit頻道。

現在,我需要實現一個1對多的關係。任何DeskUnit頻道都可以連接到多個IOUnit頻道。我意識到我可能不得不完全重新排列表格,但我不確定最好的方法來解決這個問題。

我是相當新的SQLite和數據庫一般所以任何幫助,將不勝感激。

感謝

帕特里克

回答

3

RoutingTable是許多一對多關係的典型implentation。例如:

DeskUnitName DeskUnitChannel IOUnitName IOUnitChannel 
A    1     A   1 
A    2     A   1 
B    1     A   1 
B    1     A   2 

這3個DeskUnitChannels連接到一個IOUnitChannel(A1),和兩個IOUnitChannels一個DeskUnits(B1)。

更標準化的解決辦法是這樣的:

DeskUnit   DeskUnitId, Name, NumChannels 
DeskUnitChannel DeskUnitChannelId, DeskUnitId, Channel 
IOUnit   IoUnitId, Name, NumChannels 
IOUnitChannel IoUnitChannelId, IoUnitId, Channel, DeskUnitChannelId 

這種方式有沒有很多一對多的關係。但它有三個一一對多關係:

  • 一臺單元具有零個或多個臺部通道
  • 一個IO單元具有零個或多個IO單元通道
  • 一臺單元的信道可以具有零或更多的IO單元通道

多對多關係往往會給應用程序增加很多複雜性。除非真的有必要,否則我會盡量避開它們。

+0

非常感謝您的回覆,它真的有幫助。但是,我將如何編寫一個sql語句來顯示特定DeskUnit頻道上的所有IOUnits? – Patrick 2010-06-03 16:50:39

+0

@Patrick:對於DeskUnitChannel 3,儘量'SELECT * FROM IOUnit IU內加入IOUnitChannel IUC上iu.IoUnitId = iuc.IoUnitId其中iuc.DeskUnitChannelId = 3' – Andomar 2010-06-03 17:57:01

1

其實,你已經有1對多的關係,因爲該領域是不是密鑰和/或不聲明爲唯一的。

因此,您可以使用相同的DeskUnitNameDeskUnitChannel值在RoutingTable中添加多個記錄。

+0

告訴你我是新來這個:-)。感謝您的回覆,並讓我保持直爽。 – Patrick 2010-06-03 09:05:20