我有以下三个MySQL表,我想知道一个字段是否是外键。
当用户从 tests 表中完成测试时,会在 scores 表中插入一行,其中 test_id 等于 tests 表中的test_id 。
但是,用户可以完成不是来自 tests 表的计算机自动生成的测试,当发生这种情况时, test_id 等于'0 '未出现在 tests 表中。
这意味着 test_id 不是得分表中的外键,对吗?
scores:
score_id(PK, AI), test_id(FK?), module_id(FK)...
tests:
test_id(PK, AI), module_id(FK), user_id(PK), name...
modules:
module_id(PK, AI), name....
答案 0 :(得分:1)
在我看来,您应该将列作为tests
表的外键。然后你有几个选择:
您可以在tests
表中为假劣的"计算机生成的"试验。这可能是0
的值,您现在拥有相同的数据结构。
您可以使用TestType
列来区分不同的测试。对于实例,可能需要值'Real'
和'Computer-Generated'
。然后,您将与tests
表具有外键关系。当测试类型不是正确的类型时,它将是NULL
。
您可以在(2)上进行快捷方式,只考虑计算机生成的NULL
值。
我对你的申请知之甚少,但我会亲自去找(1)或(2)。
答案 1 :(得分:0)
这取决于分数和测试之间的关系。
如果某些分数的test_id为'0',则很可能是因为它们没有test表的外键。除非另有说明,否则这不是必需的。
这是可能的,因为单个分数可能与测试表中列出的任何测试没有关系。
某些数据库会将这些值列为NULL
,而其他数据库则会列为“0”
编辑:
另外(鉴于您的附加评论),这不是外键。请参阅维基百科的以下评论
大多数数据库管理系统都提供了确保这一点的机制 每个非null外键对应于引用的一行 表
因此,在关系数据库中,如果它强制执行参照完整性约束,则不会是外键