MySQL-1列表
所以我昨天试着问这个问题,但是我对这个问题的措辞非常糟糕。我一直在设计一个数据库,我的系统基本上是容纳不同类型的生物,有三种类型的生物。这些是昆虫、空气生物和水生生物,因此这三种生物有三个单独的表格。这些生物中的每一个都有一个基本表和一个活动表,因此用户可以获得该基本生物的副本。现在我希望能够从这些表中引用另一个表的id,我不知道如何创建一个新表,只使用一个id,然后这三个基本生物中的每一个都有一个id作为父表的外键 但这样做意味着我将有一个表,该表只有一个列(ID),然后从其他表引用 基本生物表: 身份证MySQL-1列表,mysql,database,database-design,Mysql,Database,Database Design,所以我昨天试着问这个问题,但是我对这个问题的措辞非常糟糕。我一直在设计一个数据库,我的系统基本上是容纳不同类型的生物,有三种类型的生物。这些是昆虫、空气生物和水生生物,因此这三种生物有三个单独的表格。这些生物中的每一个都有一个基本表和一个活动表,因此用户可以获得该基本生物的副本。现在我希望能够从这些表中引用另一个表的id,我不知道如何创建一个新表,只使用一个id,然后这三个基本生物中的每一个都有一个id作为父表的外键 但这样做意味着我将有一个表,该表只有一个列(ID),然后从其他表引用 基本生物
1
2
3
四, 飞行特征表: 身份证名称
1鹰
2只鸟
水生物表: 身份证名称
3鲸鱼
4鲨鱼 你觉得怎么样?这样可以吗 所以对于一只水生的、低等的昆虫。。。这些表存储该生物的基本统计信息。但是,这些尚未分配给用户。为了做到这一点,需要在活动生物中创建一个新字段,以便它可以生成一个id进入活动水生生物、活动昆虫。。。桌子。用户ID是在ActiveBiodies表中指定的,而不是在各个活动表中指定的。对于一个活跃的生物,它可以有只适用于该生物的特殊属性,因此一个活跃的昆虫可以有不同于另一个的力量。ActiveBioters与BaseBioters相同,因为它们具有相同的字段(不包括用户ID)。同时,一个基础生物在一个区域的出现率比另一个区域高。(百分比表),这就是我需要在单独的表中指定基本生物ID的原因,以便我可以在百分比表中使用它。你认为有更有效的方法吗?我的另一个问题是,在百分比表上,我是否真的需要存储tableID和base id。我是否可以只存储baseID,然后从baseBioters表中获取id和tableID 另一个想法是,我也可以在BaseBioters表中放置通用列,如生物名称,但在布置信息时可能会混淆,因为名称不会与特定于生物的表中的其他信息混淆。第二次编辑(原始内容在'----'后面) 好的,我想我现在明白了,并且看到了基础对主动的需要 基本生物类似于一个物种名称(气垫船上会有不同种类的鸟)。主动生物是该物种的一个特定实例(比如我的猫鲍勃是(不存在的)陆地类型基础生物“猫”的主动生物) 在这种情况下,我认为您的表格应该是:
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的组合键,因此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
同样,类型为_id-base_id-id(Jaws为2-2-1)的复合PK
然后,可以将BaseBioters表构建为所有空气、水生物和昆虫基础表的联合,然后可以在百分比表中使用这些基础表
因此,我并没有对ERD做太多修改,只是修改PKs使其更有意义,并将“Tables”表修改为“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
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
然后,您可以通过引用表2中的生物id来引用活动表中的给定生物。将生物类型拆分到单独表中的一个原因是减少数据冗余。它还允许您(将来)在生物类型表中添加关于每种类型的附加信息(例如,每种生物类型的描述字段:“昆虫是六足节肢动物…”),而无需更新基础或活动生物表中的每条记录
这种方法可能有效,但取决于你想要的列——有些可能无法在所有生物类型中都有效,这就是为什么你有三个独立的生物类型表
在这种情况下,我会设置如下表格:
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
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是sparrow,2-3是geoduck,等等)。我建议您的属性列表(空气、水生)将变得太长,无法作为表实现 建议您在没有标准化(ids)的情况下开始;画草图要容易得多。如果有保证的话,以后可以正常化
Animal : attribute
------ : ---------
Beetle : insect
Beetle : flying
Sparrow : flying
Bat : flying
Bat : mammal
Whale : mammal
Whale : aquatic
SELECT animal FROM tbl WHERE attribute = 'flying';
会给你3排:甲虫,麻雀,蝙蝠
稍后,您可能需要一个包含以下列的动物表:id、common_name、latin_name、general_size、Devented。。。在这一点上,您将更改为
Animal_id : attribute
------ : ---------
1 : insect
1 : flying
2 : flying
...
and
Animal_id : common_name : latin_name ...
1 Beetle ...
2 Sparrow ...
3...
您不一定需要“规范化”属性。为我上面绘制的表格不好表示歉意,我已经编辑了我的原始注释,以显示我正在使用的表格结构。BaseBiodies表中只有一个id,其中特定类型生物的其余信息在其自己的表中引用,并从中提取id