假设我想根据他们使用MS Access上瘾的药物类型来“标记”(用于研究目的)机构中的一组人。
像 -
姓名,类型*
玛丽,酗酒
莎莉,酒鬼
乔,软性药物
约翰,硬性药物
金,月亮药(这应该被拒绝,因为它不在下表中)
addiction_type,示例*
1,酒类,啤酒
2,酒类,伏特加
3,酒鬼,朗姆酒
4,软性药物,阿司匹林
5,硬性药物,甲酯
如果我希望第一个表中的Type *是第二个表中的外键,我需要创建一个显式主键。 所以我的问题是,如何在表1中使用第二个表中的addiction_type(我只希望在addiction_type下列出的类型用作第一个表中的Type字段)
我是一名研究分析师,因此对数据库设计一无所知,希望我能在网上阅读。
答案 0 :(得分:1)
这样做的方法是创建两个不同的表,一个用于人,一个用于药物,然后使用第三个表来指示关联(交叉点)。
person Table
-------------
person_id ---primary key
person_name
person_age
--other columns
Drugs Table
-----------
Drug_id --- primary key
drug_name
drug_type
--other columns
person_drug_asc
-------------------
person_drug_asc_id primary key
person_id --foreign key from person table
drug_id --foreign key from drug table
这一要求的原因是每个人可能与一种以上的药物有关,每种药物可能与一个以上的人有关。因此,将外键放在任何一个表中都不会让您模拟上述两种情况。
要获得每人的药物类型,您可以使用以下查询。
select
from person per,
drugs dru,
person_drug_asc pda
where per.person_id = pda.person_id
and dru.drug_id = pda.drug_id
and per.person_name = '<name of the person>' -- or any other way to identify the person
这将为您提供一个人上瘾的所有类型的药物清单。
答案 1 :(得分:0)
我会做以下事情:
第一张桌子(人和他们的瘾):
键,名称,成瘾
1,玛丽,酒鬼
2,Joe,Soft Drugs
3,Jim,Hard Drugs
对于第二个表(成瘾查找):
成瘾,示例
酒精,(啤酒,伏特加,朗姆酒等)
软药,(Ibprufen,Nyquil等)
我会在第二个表的Addiction列上放一个主键,然后你可以让第一个表中的Addiction字段为{FK}(不是必需的,我建议只做一个代理,或伪编号的密钥,作为主键。
答案 2 :(得分:0)
成瘾类型表(或查找表)应包含所有独特的成瘾类型。这样,第一个表中的类型字段可以“查找”第二个表中的成瘾类型。这被称为一对多的关系。
严格地说,最好在第一个表中使用ID字段作为外键。但是,对于MS访问中的目的,可能更容易在第二个表中的addiction_type(文本)字段上创建主键(基本上强制此字段是唯一的)。由于第二个表中只有一个唯一条目用于成瘾类型,因此如果需要进一步查找,示例必须是(文本)列表或分成另一个表。
答案 3 :(得分:0)
您不能创建引用具有非唯一值的列的外键约束。
另外,这是错误的想法。你有一个叫做成瘾类型的概念,每种类型都有一组人和一组例子。这意味着一个成瘾类型表,其中名称是主键(到目前为止唯一的列),另外两个表具有引用它的外键约束。
您可能认为成瘾类型表是多余的,因为它隐含在示例列表中,但如果您尝试在关系数据库系统中进行操作,那么您将进入痛苦的世界。