构建此数据库的最佳方法是什么?

时间:2010-06-17 14:04:47

标签: mysql database-design foreign-keys primary-key

目前我正在这样做:

gems(id, name, colour, level, effects, source)

id是主键,不会自动增加。

典型的数据行如下所示:

id      =>   40153
name    =>   Veiled Ametrine
colour  =>   Orange
level   =>   80
effects =>   +12 sp, +10 hit
source  =>   Ametrine

(有些游戏玩家可能会看到我在这里做的事情:))

但是我意识到这可以更好地分类。我已经在我的A-Level计算类中研究了数据库关系和辅助密钥,但从未正确设置过。我只需要帮助知道如何组织这个数据库,比如什么表应该有什么数据与哪些二级和外键?

我想的可能是3张牌桌:gemeffectssource。然后彼此有关系?

有人可以对此有所了解吗?是一种复杂的方式,就像我提出真正的方法,或者我应该继续我正在做的事情?

干杯。

5 个答案:

答案 0 :(得分:1)

我碰巧熟悉你所描述的环境(:)) 尽管你已经说服了自己,但你所做的并不是特别复杂。

无论如何,目前,你有一张没有关系的桌子。这很简单。这很简单。每个gem都存在于数据库中。

如果您要移动到您提议的三个表,那么需要包含链接表以将表组装成可用数据,特别是因为(并且介意,我不太满意)确定你的区别如何沸腾)效果和源表涉及多对多关系:每个宝石最多有两个效果,每个效果最多有Y个宝石,它存在//每个来源都有Z宝石。

我坚持使用单人桌。单个记录可能更长,但其更多更简单,并且与尝试建立链接表等时相比,您将遇到更少的错误。

答案 1 :(得分:0)

问自己的问题:

  1. gem,effects和source之间是否存在1对1的关系?
  2. 你是否更经常在不从宝石中提取数据的情况下拉动效果?
  3. 如果建议的表格具有1比1的关系,那么我建议将它们合并在一个表格中。在这种情况下,我唯一一次考虑将它们分开是因为我只需要来自效果的数据而不需要其他数据。这些表格足够大,足以证明它们存储在不同的驱动器上。否则,你只是为自己工作,增加了更多的存储需求,并获得了零利益。

答案 2 :(得分:0)

您还应该考虑是否需要实际使用的effects信息,或仅显示。如果它只是显示,那么在表格的一列中没有什么大不了的。如果你必须使用它,例如适当地应用+12和+10,那么我认为你应该将它的每次出现都放在一个单独的列中。因此,您应该有一个单独的effects表,然后是一个单独的表,用于存储哪些宝石具有哪些效果,可能是gemeffectsEffects表可能更好地描述了“sp”代表什么,可能是最小和最大范围等。GemEffects表只有gem id,值和效果本身。例如

<强>效果

effect  => hit
desc    => How many hit points
minimum => 0
maximum => 100

<强> GemEffects

id     => 40153
effect => sp
value  => 12

id     => 40153
effect => hit
value  => 10

答案 3 :(得分:0)

如果你做一个简单的练习,你会回答你自己的问题:用自然的描述性语言描述你的系统。哪些实体,它们的属性,它们如何与其他实体交互等等。强调实质性和动词。询问你想管理哪些实体(例如:是否会有一个界面来管理“效果”表?)你会惊讶地发现它们是如何自然组合的。

现在举个例子,我建议两种方法(没有句法细节)

1)获得关系设计方面的经验,具有一定的复杂性开销,并且细化每个实体

  • gem(id,name,color_id,source_id,effect_assoc_id)
  • color(id,name)
  • source(id,name)
  • 效果(id,value,nature_id)
  • nature(id,name)
  • effect_assoc(id,gem_id,effect_id)

2)直截了当,可能有效,取决于你们关系的基数

继续;)

根据你的描述,我会选择#1。

答案 4 :(得分:0)

我会推荐以下内容:

  1. 将所有效果移动到他们自己的表格中(例如,ID,​​名称,描述,已启用,...)
  2. 将源移动到自己的表中(例如,ID,​​名称,描述,已启用,......)
  3. 删除宝石“效果”列(迁移到下面的第5步)
  4. 将gems“source”列转换为与“source”表中的PK对应的外键值
  5. 添加新表以将单个gem实体链接到零个或多个效果实体
    示例:tbl_GemsEffectsLink,其中包含两个名为“GemID”和“EffectID”的列,
    它们本身是回到实体表的外键,当合在一起时,组成了
    复合主键。

    此链接表的示例视图如下:
          GemID EffectID
            1      1
            1      2
            2      1
            2      2
            2      3
    
  6. 因此,总而言之,您将拥有以下表格:

    1. 宝石
    2. 效果
    3. gemseffectslink
    4. 每个表格包含以下列:

      1. 宝石
        id(PK)
        命名
        颜色
        水平
        sourceid(FK)

      2. 效果
        id(PK)
        命名
        说明
        启用
        ...


      3. id(PK)
        命名
        说明
        启用
        ...

      4. gemseffectslink
        gemid(FK)
        有效(FK)

      5. 最后,假设每个gem可以有零个或多个效果,一个源(你可以为这个gem.sourceid FK字段强制执行NULL或NOT NULL),并且级别整数值就是那个(即,不代表更强大和详尽的东西,因为存在某种类型的“Level”实体,并且样本数据行中的“80”值唯一地标识其中一个“Level”实体。

        希望这有帮助!
        迈克尔