所以我昨天试着问这个问题,但是我对这个问题的措辞相当糟糕。我被困在设计一个数据库,我的系统基本上是不同类型的生物,有三种类型的生物。这些是昆虫,空气生物和水生生物,所以有三个分开的桌子为这三个。这些生物中的每一个都有一个基表和一个活动表,这样用户就可以得到这个基本生物的副本。现在,我希望能够从这些表中引用另一个表中的id,我不确定除了用一个id创建一个新表之外,还有这三个基生物中的每一个都具有id是这个父表的外键。
但是,这样做意味着我将有一个表,该表只有一个列(ID),然后从其他表中引用该列。
BaseCreatures表:
id
1
2
3.
4.
AirCreatures表:
id名
1只鹰
2只鸟
AquaticCreatures表:
id名
3只鲸鱼
4条鲨鱼
你认为如何?这样可以吗?
所以用baseAquatic,baseInsect..。这些表存储了该生物的基本状态。然而,这些尚未分配给用户。为了做到这一点,需要在activeCreature中创建一个新字段,以便它可以生成一个id以进入activeAquatic,activeInsect.桌子。userID在activeCreatures表中指定,而不是在单个活动表中指定。对于一个活跃的生物,它可以有特殊的统计数据,只适用于该生物,因此一种活动昆虫可以具有与另一种不同的力量。activeCreatures和baseCreatures是一样的,因为除了userID之外,它们的字段是相同的。此外,在一个区域出现的比例比另一个区域要好。(百分比表),这就是为什么我需要在单独的表中指定基本参数ids的原因,这样我就可以在百分比表中使用它。你认为有更有效的方法吗?另一个问题是,在百分比表上,是否真的需要存储tableID和基本id。我不能只存储baseID,然后从baseCreatures表中获取id和tableID。
另一个想法是,我也可以在baseCreatures表中放一些通用列,比如生物名,但是当列出信息时,这可能会引起混淆,因为名称不会与特定于生物的表中的其他信息相对应。
发布于 2016-01-05 23:08:56
第二种编辑(原始内容跟在AT‘
基本生物就像一个物种名称(空气表会有不同种类的鸟)。活动生物是该物种的一个特定实例(就像我的猫鲍勃是(不存在的)陆地型基本生物‘猫’的活跃生物)。
在这种情况下,我认为你们的桌子应该是:
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
基表的主键是类型id和基id的复合键,所以鲨鱼是2-2,金丝雀是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
同样,复合PK型id-base_id-id (Jaws为2-2-1).
然后,BaseCreatures表可以作为所有空气、水生、昆虫基表的统称,然后可以在百分比表中使用。
因此,我并没有真正改变您的ERD,只是修改PKs使之更有意义,并将“table”表修改为“Type”表(这可能更有意义)。
(抛开一切:你的ERD显示出一切都是一对一的关系,而实际上它们是一对多的,以防这件事发生。)
我希望这能帮上忙。。。
编辑(这是上一篇文章的内容)--你对不同动物类型需要不同表格的解释对我有很大帮助。
我可以想出两种方法来处理你的情况。一个是试着挽救我原来的答案:)另一个是跟你的三张桌子一样。
在第一种情况下,您可以尝试将所有动物安装在一个表中,其中的列可用于所有生物类型:
如果你有这样的安排:
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来引用活动表中的给定生物。将生物类型拆分到单独的表中的一个原因是减少数据冗余。它还允许您(在未来)添加关于每一种类型的附加信息(例如,每个生物类型的描述字段:“昆虫是六足类节肢动物……”)到生物类型表,而不必更新基表或活动生物表中的所有记录。
这个应用程序可能会工作,但取决于您想要的列,而且有些可能不能很好地工作在所有的生物类型中,这就是为什么您有三个单独的生物类型表。
在这种情况下,我会设置这样的桌子:
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是地鸭,等等)。
发布于 2016-01-06 00:00:08
我建议您的属性列表(Air,Aquatic)会增长得太长,无法作为表实现。
建议您开始时不要使用规范化(ids);这样可以更容易地勾画出来。稍后,如果需要的话,您可以将其正常化。
Animal : attribute
------ : ---------
Beetle : insect
Beetle : flying
Sparrow : flying
Bat : flying
Bat : mammal
Whale : mammal
Whale : aquatic
SELECT animal FROM tbl WHERE attribute = 'flying';
会给你三排:甲虫,麻雀,蝙蝠。
稍后,您可能需要一个列的动物表,如: id、common_name、latin_name、general_size、濒危物种.在这一点上,您将更改为
Animal_id : attribute
------ : ---------
1 : insect
1 : flying
2 : flying
...
and
Animal_id : common_name : latin_name ...
1 Beetle ...
2 Sparrow ...
3...
您不一定需要对属性进行“规范化”。
https://stackoverflow.com/questions/34622788
复制相似问题