我正在构建一个学习工具,我不确定构建数据库的最佳方法。
基本上,我有一个简单但很大的表,其中包含大约50000位信息。
info(50'000行)
ID INFO_TEXT
用户
ID 名称 电子邮件 密码 等
我想要的是让学生能够将每个项目标记为已学习或被研究(基本上是开关),以便他们可以在修改每个项目时勾选它们。
我想构建工具来应对成千上万的用户,并且想知道设置数据库和相关查询的最有效/最简单的选择方法是什么。
此刻,我倾向于只有一个带有两个主键的巨大表,一个用户ID,然后是他们研究过的信息的id,然后做一些JOIN语句,所以我只能撤回他们的项目离开学习。
USER_INFO
USER_ID info_id
提前致谢
答案 0 :(得分:0)
我会做这样的事情:
1)具有uid主键的用户表
2)注册表(此表显示已注册学生的所有课程),主键为(uid,cid)
3)一个项目(信息)表,包含要学习的所有项目,主键为itemid
然后在登记表中只有一个属性(二进制标志)1意味着它已被研究,0意味着他们仍然需要研究它。
答案 1 :(得分:0)
以下是模拟这种情况的一种方法:
中间的表在USER_ID和ITEM_ID上有一个复合主键,因此两者中的组合必须是唯一的,即使它们不必单独存在。
相反,当且仅当缺少STUDIED中的相应行时,用户才研究该项目。要拉出给定用户尚未研究的所有项目,您可以执行以下操作:
SELECT * FROM ITEM
WHERE NOT EXISTS (
SELECT * FROM STUDIED
WHERE
USER_ID = <given_user_id>
AND ITEM.ITEM_ID = STUDIED.ITEM_ID
)
或者,或者:
SELECT ITEM.*
FROM ITEM LEFT JOIN STUDIED ON ITEM.ITEM_ID = STUDIED.ITEM_ID
WHERE USER_ID = <given_user_id> AND STUDIED.ITEM_ID IS NULL
这个设计的好处是你不需要提前关心STUDIED表。添加新用户或项目时,只需单独留下STUDIED - 随着用户的学习进度,您将逐渐填写它。