我在我的应用程序中成功实现了以下架构。该应用程序将桌面单元通道连接到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和数据库相当新,所以任何帮助都会受到赞赏。
由于
帕特里克
答案 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
这种方法没有多对多的关系。但它有三个一对多的关系:
多对多关系往往会给应用程序增加很多复杂性。我试图避免它们,除非它们确实是必要的。
答案 1 :(得分:1)
实际上,您已经有1对多的关系,因为这些字段不是键和/或未被声明为唯一。
因此,您可以在RoutingTable
中添加多个记录,并使用相同的DeskUnitName
和DeskUnitChannel
值。