首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL -1列表

MySQL -1列表
EN

Stack Overflow用户
提问于 2016-01-05 22:58:09
回答 2查看 95关注 0票数 0

所以我昨天试着问这个问题,但是我对这个问题的措辞相当糟糕。我被困在设计一个数据库,我的系统基本上是不同类型的生物,有三种类型的生物。这些是昆虫,空气生物和水生生物,所以有三个分开的桌子为这三个。这些生物中的每一个都有一个基表和一个活动表,这样用户就可以得到这个基本生物的副本。现在,我希望能够从这些表中引用另一个表中的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表中放一些通用列,比如生物名,但是当列出信息时,这可能会引起混淆,因为名称不会与特定于生物的表中的其他信息相对应。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-05 23:08:56

第二种编辑(原始内容跟在AT‘

基本生物就像一个物种名称(空气表会有不同种类的鸟)。活动生物是该物种的一个特定实例(就像我的猫鲍勃是(不存在的)陆地型基本生物‘猫’的活跃生物)。

在这种情况下,我认为你们的桌子应该是:

代码语言:javascript
运行
复制
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。

对于活跃的生物来说,同样的想法:

代码语言:javascript
运行
复制
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显示出一切都是一对一的关系,而实际上它们是一对多的,以防这件事发生。)

我希望这能帮上忙。。。

编辑(这是上一篇文章的内容)--你对不同动物类型需要不同表格的解释对我有很大帮助。

我可以想出两种方法来处理你的情况。一个是试着挽救我原来的答案:)另一个是跟你的三张桌子一样。

在第一种情况下,您可以尝试将所有动物安装在一个表中,其中的列可用于所有生物类型:

如果你有这样的安排:

代码语言:javascript
运行
复制
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来引用活动表中的给定生物。将生物类型拆分到单独的表中的一个原因是减少数据冗余。它还允许您(在未来)添加关于每一种类型的附加信息(例如,每个生物类型的描述字段:“昆虫是六足类节肢动物……”)到生物类型表,而不必更新基表或活动生物表中的所有记录。

这个应用程序可能会工作,但取决于您想要的列,而且有些可能不能很好地工作在所有的生物类型中,这就是为什么您有三个单独的生物类型表。

在这种情况下,我会设置这样的桌子:

代码语言:javascript
运行
复制
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

然后就有了

代码语言:javascript
运行
复制
CreatureTypes
id   TypeName
1    Air
2    Aquatic
3    Insect

正如你所建议的。

然后,当您进入基表或活动表时,您可以使用由id和type_id组成的复合主键引用特定的生物(1-2是麻雀,2-3是地鸭,等等)。

票数 2
EN

Stack Overflow用户

发布于 2016-01-06 00:00:08

我建议您的属性列表(Air,Aquatic)会增长得太长,无法作为表实现。

建议您开始时不要使用规范化(ids);这样可以更容易地勾画出来。稍后,如果需要的话,您可以将其正常化。

代码语言:javascript
运行
复制
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、濒危物种.在这一点上,您将更改为

代码语言:javascript
运行
复制
Animal_id : attribute
------  : ---------
1       : insect
1       : flying
2       : flying
...
and
Animal_id : common_name : latin_name ...
1           Beetle        ...
2           Sparrow       ...
3...

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34622788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档