2010-05-30 141 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