与SQLite实现1对多的关系

时间:2010-05-30 10:35:27

标签: sql sqlite

我在我的应用程序中成功实现了以下架构。该应用程序将桌面单元通道连接到IO单元通道。 DeskUnits和IOUnits表基本上只是桌面/ IO单元列表和每个单元的通道数。例如,桌子可以是4或12通道。

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

然后,RoutingTable'表'将每个DeskUnit频道连接到IOUnit频道。例如,名为“Desk1”通道1的DeskUnit可以路由到IOunit名称“IOUnit1”通道2等。

到目前为止,我希望这是非常简单易懂的。然而,问题是严格的1对1关系。任何DeskUnit频道都只能路由到1个IOUnit频道。

现在,我需要实现1对多的关系。任何DeskUnit通道都可以连接到多个IOUnit通道。我意识到我可能需要完全重新排列表格,但我不确定最好的方法。

我对SQLite和数据库相当新,所以任何帮助都会受到赞赏。

由于

帕特里克

2 个答案:

答案 0 :(得分:3)

您的RoutingTable是多对多关系的典型实现。例如:

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

这会将三个DeskUnitChannel连接到一个IOUnitChannel(A1),将两个IOUnitChannel连接到一个DeskUnits(B1)。

更规范化的解决方案如下:

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

这种方法没有多对多的关系。但它有三个一对多的关系:

  • 桌面单元具有零个或多个桌面单元通道
  • IO单元具有零个或多个IO单元通道
  • 桌面单元通道可以有零个或多个IO单元通道

多对多关系往往会给应用程序增加很多复杂性。我试图避免它们,除非它们确实是必要的。

答案 1 :(得分:1)

实际上,您已经有1对多的关系,因为这些字段不是键和/或未被声明为唯一。

因此,您可以在RoutingTable中添加多个记录,并使用相同的DeskUnitNameDeskUnitChannel值。