MySQL - 1列表

时间:2016-01-05 22:58:09

标签: mysql database database-design

所以昨天我试着问这个,但是我对这个问题的措辞非常糟糕。我坚持设计一个数据库,我的系统基本上拥有不同类型的生物,并且有三种类型的生物。这些是昆虫,空气生物和水生生物,因此这三个有三个独立的桌子。这些生物中的每一个都有一个基表和一个活动表,以便用户可以获得该基础生物的副本。现在我希望能够从另一个表中引用这些表中的id,我不知道除了创建一个只有id的新表,然后这三个基本生物中的每一个都有id是这个父表的外键。

这样做意味着我会有一个只有一列(ID)的表,然后从其他表中引用。

BaseCreatures表:

id

1
2
3
4

AirCreatures表:

id name

1 p鹰1 2鸟

AquaticCreatures表:

id name

鲸3 4鲨鱼

你怎么看?可以这样做吗?

enter image description here

因此,使用baseAquatic,baseInsect ...表,这些表存储该生物的基本属性。然而,这些尚未分配给用户。为了做到这一点,需要创建activeCreature中的新字段,以便它可以生成一个id进入activeAquatic,activeInsect ...表。 userID在activeCreatures表中指定,而不是在各个活动表中指定。对于一个活跃的生物,它可以具有仅适用于该生物的特殊属性,因此一个活跃的植物可以具有与另一个不同的强度。 activeCreatures与baseCreatures相同,因为它们具有禁止userID的相同字段。同样,一个区域中的基质可以比另一个区域出现更好的百分比。 (百分比表),这就是我需要在单独的表中指定basecreature id的原因,这样我就可以在百分比表中使用它。 Dyou认为有更有效的方法吗?我的另一个问题是,在百分比表上,我真的需要存储tableID和基本id。我不能只存储baseID,然后从baseCreatures表中获取id和tableID。

另一个想法是我可以在baseCreatures表中放置诸如生物名称之类的通用列,但是在布置信息时可能会让人感到困惑,因为名称与生物特定表中的其他信息不同。 / p>

2 个答案:

答案 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';

您不一定需要“规范化”属性。