所以昨天我试着问这个,但是我对这个问题的措辞非常糟糕。我坚持设计一个数据库,我的系统基本上拥有不同类型的生物,并且有三种类型的生物。这些是昆虫,空气生物和水生生物,因此这三个有三个独立的桌子。这些生物中的每一个都有一个基表和一个活动表,以便用户可以获得该基础生物的副本。现在我希望能够从另一个表中引用这些表中的id,我不知道除了创建一个只有id的新表,然后这三个基本生物中的每一个都有id是这个父表的外键。
这样做意味着我会有一个只有一列(ID)的表,然后从其他表中引用。
id
1
2
3
4
id name
1 p鹰1 2鸟id name
鲸3 4鲨鱼 你怎么看?可以这样做吗?因此,使用baseAquatic,baseInsect ...表,这些表存储该生物的基本属性。然而,这些尚未分配给用户。为了做到这一点,需要创建activeCreature中的新字段,以便它可以生成一个id进入activeAquatic,activeInsect ...表。 userID在activeCreatures表中指定,而不是在各个活动表中指定。对于一个活跃的生物,它可以具有仅适用于该生物的特殊属性,因此一个活跃的植物可以具有与另一个不同的强度。 activeCreatures与baseCreatures相同,因为它们具有禁止userID的相同字段。同样,一个区域中的基质可以比另一个区域出现更好的百分比。 (百分比表),这就是我需要在单独的表中指定basecreature id的原因,这样我就可以在百分比表中使用它。 Dyou认为有更有效的方法吗?我的另一个问题是,在百分比表上,我真的需要存储tableID和基本id。我不能只存储baseID,然后从baseCreatures表中获取id和tableID。
另一个想法是我可以在baseCreatures表中放置诸如生物名称之类的通用列,但是在布置信息时可能会让人感到困惑,因为名称与生物特定表中的其他信息不同。 / p>
答案 0 :(得分:2)
第二次编辑(原始内容跟随' -----') 好吧,我想我现在就明白了,看看Base vs. Active的必要性。
基础生物就像一个物种名称(空气表会有不同种类的鸟)。 Active Creature是该物种的特定实例(就像我的猫Bob是(不存在的)Land-type Base Creature' Cat')的活跃生物。
在这种情况下,我认为你的表应该是:
Type
id name
-------------------
1 Air
2 Aquatic etc
BaseAir
type_id id name type_specific_attribute
----------------------------------------------------
1 1 eagle (wing-span?)
1 2 canary (wing-span?) etc
BaseAquatic
type_id id name type_specific_attribute
----------------------------------------------------
2 1 dolphin (number of fins?)
2 2 shark (number of fins?) etc
Base表的主键是id类型和基本id的复合键,因此shark是2-2,canary是1-2。
对于活跃的生物,同样的想法:
ActiveAir
type_id base_id id name specific_characteristic
--------------------------------------------------------
2 1 1 Flipper (swim speed?)
2 1 2 Opo (swim speed?)
2 2 1 Jaws (swim speed?) etc
同样,type_id-base_id-id的复合PK(Jaws是2-2-1)。
然后可以将BaseCreatures表构建为所有空气,水生昆虫基础表的UNION,然后可以在百分比表中使用。
所以我并没有真正改变你的ERD,只是修改PK更有意义并修改表格'表格'表格是'类型'表(可能更有意义)。
(总的来说:你的ERD表明一切都是一对一的关系,当他们真的是一对多的时候,如果重要的话。)
我希望有帮助。 。 。
EDITED(这是之前的帖子内容) - 您对不同动物类型的不同表的需求的解释对我有很大帮助。
我可以想出两种方法来处理你的情况。一个是试图挽救我原来的答案:)另一个是与你的三个表情况一起去。
在第一种情况下,您可以尝试将所有动物放入一个表中,其中列设计适用于所有生物类型:
如果你有这样的设置:
table 1: creature type table
type_id type_name
-------------------
1 insect
2 air
3 aquatic
table 2: base creature table
creature_id name type (from table 1) #appendages size
------------------------------------------------------------------------
1 beetle 1 2 wings, 6 legs small
2 dolphin 3 3 fins medium
3 sparrow 2 2 wings, 2 legs small
4 eagle 2 etc
5 trout 3
然后您可以通过引用表2中的creature_id来引用活动表中的给定生物。将生物类型拆分为单独表的一个原因是减少数据冗余。它还允许您(将来)向生物类型表中添加关于每种类型的额外信息(例如,每种生物类型的描述字段:'昆虫是六足节肢动物... ...#39;)而不必更新基本或活动生物表中的每个记录。
这个appraoch可能有效,但取决于你想要的列 - 有些可能不适用于所有生物类型,这就是为什么你有三个独立的生物类型表。
在这种情况下,我会像这样设置表格:
AirCreatures
id name type_id column1 col2 and other type-specific info
------------------------------------------------------------------------
1 eagle 1 (wing span?) (feather length) etc
2 sparrow 1 etc
3 bat 1 etc
AquaticCreatures
id name type_id column1 col2 and other type-specific info
------------------------------------------------------------------------
1 dolphin 2 (max time underwater?) (is a fish?) etc
2 shark 2 etc
3 geoduck 2 etc
然后有
CreatureTypes
id TypeName
1 Air
2 Aquatic
3 Insect
正如你的建议。
然后,当你去基础或活动表时,你可以引用具有由id和type_id组成的复合主键的特定生物(1-2是麻雀,2-3是象拔蚌等)。
答案 1 :(得分:0)
我建议您的属性列表(Air,Aquatic)将变得太长,无法实现为表格。
建议您启动而不进行规范化(ids);草图将更容易。 稍后如果有必要,您可以进行规范化。
dealer_id
会给你3行:Beetle,Sparrow,Bat。
稍后,您可能需要一个包含以下列的动物的表:id,common_name,latin_name,general_size,endangered,......此时,您将更改为
Animal : attribute
------ : ---------
Beetle : insect
Beetle : flying
Sparrow : flying
Bat : flying
Bat : mammal
Whale : mammal
Whale : aquatic
SELECT animal FROM tbl WHERE attribute = 'flying';
您不一定需要“规范化”属性。