使用SQLite实现一对多关系
我已经在我的应用程序中成功实现了以下模式。应用程序将桌面单元通道连接到IO单元通道。DeskUnits和IOUnits表基本上只是一个desk/IO单元和每个单元上的通道数的列表。例如,一张桌子可以是4或12频道使用SQLite实现一对多关系,sql,sqlite,Sql,Sqlite,我已经在我的应用程序中成功实现了以下模式。应用程序将桌面单元通道连接到IO单元通道。DeskUnits和IOUnits表基本上只是一个desk/IO单元和每个单元上的通道数的列表。例如,一张桌子可以是4或12频道 CREATE TABLE DeskUnits (Name TEXT, NumChannels NUMERIC); CREATE TABLE IOUnits (Name TEXT, NumChannels NUMERIC); CREATE TABLE RoutingTable (Des
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“table”将每个DeskUnit通道连接到一个IOUnit通道。例如,称为“Desk1”通道1的DeskUnit可以路由到IOunit名称“IOUnit1”通道2,等等
到目前为止,我希望这是非常直接和可以理解的。然而,问题是,这是一种严格的1对1关系。任何DeskUnit通道只能路由到1个IOUnit通道
现在,我需要实现1对多关系。任何DeskUnit通道都可以连接到多个IOUnit通道。我意识到我可能必须完全重新安排桌子,但我不确定最好的方法是什么
我是SQLite和数据库的新手,所以如果有任何帮助,我将不胜感激
谢谢
Patrick实际上,您已经有了1对多关系,因为字段不是键和/或没有声明为唯一的
因此,您可以使用相同的
DeskUnitName
和DeskUnitChannel
值在RoutingTable
中添加多条记录。实际上,您已经有了1对多关系,因为字段不是键和/或未声明为唯一
因此,您可以使用相同的
DeskUnitName
和DeskUnitChannel
值在RoutingTable
中添加多条记录。您的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单元通道
多对多关系往往会给应用程序增加很多复杂性。除非它们确实是必要的,否则我会尽量避免它们。您的
路由表是多对多关系的典型实现。例如:
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单元通道
多对多关系往往会给应用程序增加很多复杂性。除非真的有必要,否则我会尽量避免使用它们。告诉过你,我不熟悉这个:-)。谢谢你的回复和直截了当的回答。我告诉过你我是新来的:-)。谢谢你的回复,让我直截了当。非常感谢你的回复,它真的很有帮助。但是我该如何编写sql语句来显示特定DeskUnit频道上的所有IOUnits?@Patrick:对于DeskUnitChannel 3,请尝试select*from IOUnit iu internal join IOUnitChannel iu on iu.IoUnitId=iuc.IoUnitId,其中iuc.DeskUnitChannelId=3
,非常感谢您的回复,这真的很有帮助。但我如何编写sql语句来显示特定DeskUnit通道上的所有IOUnits?@Patrick:对于DeskUnitChannel 3,请尝试从IOUnit iu内部连接IOUnitChannel iuc on iu.IoUnitId=iuc.IoUnitId,其中iuc.DeskUnitChannelId=3