Sqlite 在一个查询中加载引用数据的有效方法

Sqlite 在一个查询中加载引用数据的有效方法,sqlite,Sqlite,我的应用程序使用数据库来保存数据。我有一个表对象,看起来像 localID | title | content 1 Test "1,embed","3,embed","5,append" localID | content 1 Alpha 2 Beta 3 Gamma 4 Delta 5 Epsilon 还有另一个表Contents,看起来像

我的应用程序使用数据库来保存数据。我有一个表
对象
,看起来像

localID  |   title   |  content
1            Test       "1,embed","3,embed","5,append"
localID  |  content
1           Alpha
2           Beta
3           Gamma
4           Delta
5           Epsilon
还有另一个表
Contents
,看起来像

localID  |   title   |  content
1            Test       "1,embed","3,embed","5,append"
localID  |  content
1           Alpha
2           Beta
3           Gamma
4           Delta
5           Epsilon
主应用程序在主线程中运行,整个数据库在第二个线程中运行。因此,如果我的应用程序加载,我希望将每个记录(QSqlRecord)传递给主线程,在主线程中对其进行进一步处理(加载到实际对象中)。我通过信号传递那张唱片。但是我的数据被分成两个表。我想返回一个包含这两个元素的记录,可能类似于join:

localID  |   title   |  content
1            Test       "Alpha,embed","Gamma,embed","Epsilon,append"
这样,我就可以在一个线程返回值之后立即获得所有需要的信息。如果不合并,我将不得不为每个引用的内容调用数据库。 我希望数据库包含的记录少于100.000条,但有些内容可能很大(文件保存为blob,例如大小为300 mb左右的书)

我有两个问题:

  • (如何)在查询中以这种方式联接表(高效)
  • 我是否过于关注线程,应该将其设置为单线程? 这样我就不需要处理多个读取请求

作为一个侧节点,这是我在数据库管理员上的第一篇帖子,我不太确定这个网站或Stackoverflow是否是提出这个问题的合适地方。

对于任何实际问题,请使用@Vérace在评论中推荐的方法,
i、 e.一个“链接”表。就是这样

但是,如果您被迫保留数据库结构
或者为了好玩
或用于学习(由迁移标题指示),
学习肮脏的技巧,而不是好的设计…
看看这个:

select
    localID, title,
(      
    with recursive cnt(x) as
    (    select ','||a.content 
       union all 
         select replace(x, '"'||b.localID||',', '_"'||b.content||',') 
           from cnt, toy2 as b
    )
    select replace('_"'||replace(x, ',_"', ',"'), '_","', '"') from cnt 
    where not x like '%,"%' LIMIT 1
) as 'content' from toy as a; 
  • 使用递归方法灵活地 (对AlphaBeta表中的条目数量或其使用数量没有任何假设)
    用希腊文替换数字
  • 应用带“\u1”的命名方案以创建结束条件
  • 在内容前加上“u”,使其能够被处理
    并配合终端条件
  • 清除所需输出的结束条件“\uS”
  • 在输出行开始处清除特殊情况
  • 选择递归结果和其他所需输出
请注意,假设您的表自然不包含“\uuuuu”或“\uuuuu”。如果发生这种情况,请选择更多“奇怪”的字符串。如果你的表中有各种各样的字符串,那么你可以看一个非常温和的例子,维拉斯将其描述为“一个即将发生的事件”。事实上,这个非平凡的解决方案本身可能就是一个已经发生的desaster

输出(和
模式列上的
.headers
):

这是我的mcve(
.dump
),还有一行“mal”用于测试:

BEGIN TRANSACTION;
CREATE TABLE toy (localid int, title varchar(20), content varchar(100));
INSERT INTO toy VALUES(1,'Test','"1,embed","3,embed","5,append"');
INSERT INTO toy VALUES(2,'mal','"2,append","4,embed"');
CREATE TABLE toy2 (localID int, content varchar(10));
INSERT INTO toy2 VALUES(1,'Alpha');
INSERT INTO toy2 VALUES(2,'Beta');
INSERT INTO toy2 VALUES(3,'Gamma');
INSERT INTO toy2 VALUES(4,'Delta');
INSERT INTO toy2 VALUES(5,'Epsilon');
COMMIT;

SQLite 3.18.0 2017-03-28 18:48:43

这种处理数据的方式是一场等待发生的灾难。查看Codd的规则和规范化。是的,我知道规范化,但我找不到另一个解决方案如何将多个内容映射到一个对象,因为它们也可以属于其他对象。好的,我可以将排列信息(“嵌入”)替换到不同的位置,但这不会改变主要问题。我需要这里解释的连接表吗?是的,一个“链接”表,或者“连接”表,或者,正如您所说的,一个“连接”表将是一个更好的解决方案。您加入的表将由Table1\u id、Table2\u id唯一索引组成。。。