Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQLite实现一对多关系_Sql_Sqlite - Fatal编程技术网

使用SQLite实现一对多关系

使用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

我已经在我的应用程序中成功实现了以下模式。应用程序将桌面单元通道连接到IO单元通道。DeskUnits和IOUnits表基本上只是一个desk/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“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