繁体   English   中英

我应该为抽认卡应用程序使用单独的表格吗?

[英]Should I use separate tables for a flashcards app?

我正在为抽认卡应用程序设计MySQL数据库。 我有一个名为“课程”的表,其中保存了课程的ID,名称和说明,还有一个名为“项目”的表,其中保存了所有抽认卡。 表格项保留唯一的ID,课程ID以及问题,答案和更多详细信息。 还有一个称为重复的表,我在其中存储用户已记忆的抽认卡的数据。 如果我想获得用户尚未记忆的抽认卡,则使用LEFT JOIN查询数据库,以便从抽认卡获取所有数据,并从匹配的重复项获取行。 但是,我必须指定某个抽认卡所属的课程,因此我的查询看起来像这样:

SELECT * 
    FROM (SELECT * 
              FROM flashcards 
              WHERE course='coursename') AS flashcards 
        LEFT JOIN repetitions 
            ON flashcards.id=repetitions.flashcardid 
    WHERE repetitions.lastrepetition IS NULL 
    LIMIT 1;

最好为每门课程都使用单独的表格,这样我就不必指定我的意思了? 这样可以加快数据库速度吗? 不会有很多课程(大约10至20个),每个课程将包含大约5k至10k的抽认卡。

抱歉,我忘记说了,如果用户没有记住抽认卡,则表重复中将没有任何等效记录。 我实际要做的是:1.在所有课程表=课程名称='课程名称'的情况下,选择2.在用户='用户'和课程名称='课程名称'的所有重复项中选择3.然后从第一个表中保留记录与第二个表中的记录。 我从某个特定的课程中获取了所有抽认卡,其中一些记录在重复表4中具有其等效项。然后,我使用WHERE重复IS NULL,并且仅获得那些在重复表中没有其等价物的抽认卡。

    SELECT * FROM
    (SELECT * FROM flashcards WHERE course='coursename') AS f
    LEFT JOIN
    (SELECT * FROM repetitions WHERE user='user' AND course='coursename') AS r
    ON f.id=r.flashcardid
    WHERE repetitions IS NULL LIMIT 1)

上面的查询工作正常,但是我想知道是否有更多的人在使用该应用,它是否不需要太多的RAM /内存。

我有atm的唯一更好的解决方案是仅从抽认卡表中选择ID,并将LIMIT设置为用户的限制(例如,每个会话30张抽认卡)。 然后,我将只使用一次此查询,而不是30次。 而且我可以在GET变量中传递ID。 (此解决方案的唯一问题是,如果用户在PC上学习闪存卡,然后转到移动设备,却忘记关闭PC的会话并返回PC,则某些重复操作可能会被覆盖。无论如何,这将是一种非常罕见的情况,但仍然有可能。)


谢谢你的帮助! 您的建议实际上恰好是对的。 我只是想出我在哪里犯了一个错误-在我的原始查询中,我不必要地添加了“ WHEREpetitions.course ='coursename'”条件。 但是,我仍然必须在右表中使用方括号来确定用户。

SELECT * FROM flashcards AS f
LEFT JOIN (SELECT * FROM repetitions WHERE user='username') AS r
ON f.id=r.flashcardid
WHERE f.course='coursename' AND r IS NULL

您不应将课程拆分为自己的表格。

你不能做这样的事情吗?

select * from flashcards
left join repititions
  on flashcards.id = repititions.flashcardid
where course = 'coursename' 
and repititions.lastrepitition is null
limit 1

我认为没有理由为每个课程增加单独的表格的开销和麻烦。 此外,也不需要该子查询。 您的查询可以写为:

SELECT *
    FROM flashcards f
        LEFT JOIN repetitions r
            ON f.id = r.flashcardid
    WHERE f.course = 'coursename'
        AND r.lastrepetition IS NULL
    LIMIT 1;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM