数据库设计:如何表示表中的一组对象

时间:2011-03-02 21:26:56

标签: database-design

假设我想根据他们使用MS Access上瘾的药物类型来“标记”(用于研究目的)机构中的一组人。

像 -

姓名,类型*
玛丽,酗酒 莎莉,酒鬼 乔,软性药物
约翰,硬性药物 金,月亮药(这应该被拒绝,因为它不在下表中)

addiction_type,示例*
1,酒类,啤酒
2,酒类,伏特加
3,酒鬼,朗姆酒 4,软性药物,阿司匹林
5,硬性药物,甲酯

如果我希望第一个表中的Type *是第二个表中的外键,我需要创建一个显式主键。 所以我的问题是,如何在表1中使用第二个表中的addiction_type(我只希望在addiction_type下列出的类型用作第一个表中的Type字段)

我是一名研究分析师,因此对数据库设计一无所知,希望我能在网上阅读。

4 个答案:

答案 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)

您不能创建引用具有非唯一值的列的外键约束。

另外,这是错误的想法。你有一个叫做成瘾类型的概念,每种类型都有一组人和一组例子。这意味着一个成瘾类型表,其中名称是主键(到目前为止唯一的列),另外两个表具有引用它的外键约束。

您可能认为成瘾类型表是多余的,因为它隐含在示例列表中,但如果您尝试在关系数据库系统中进行操作,那么您将进入痛苦的世界。