在处理同一个表的多个许多一对多的关系?

问题描述 投票:0回答:1

我是一个偶然的DBA。大部分我一起工作的数据模型可以表示为简单的一对多的关系,在这里或那里的奇结表模型偶尔许多一对多的关系。我经历了一个情况,就是新的给我跑,我不能确定的模型它的正确方法。

我的应用程序决定了特定的属性可以在需要进行离散指定几种不同的方法进行修改。考虑从d&d,其中妖怪可以有抵抗力,免疫力,或漏洞来自各种损伤类型的示例(例如,“抗蚀剂酸,火,闪电,容易感冒)

在这个例子中,我首先想到的是要构建的怪物,修改类型和伤害类型,并将它们全部之间的结台独立的表 - 类似下面。

CREATE TABLE monsters (
    id char(32) NOT NULL,
    monster_name varchar(100) NOT NULL,
    PRIMARY KEY (id)
)

CREATE TABLE dmgModTypes (
    id char(32) NOT NULL,
    dmg_modifier varchar(20) NOT NULL,
    PRIMARY KEY (id)
)

CREATE TABLE dmgTypes (
    id char(32) NOT NULL,
    dmg_type varchar(25) NOT NULL,
    PRIMARY KEY (id)
)

CREATE TABLE monster_dmg_mod (
    id char(32) NOT NULL,
    monster_id char(32) NOT NULL,
    dmgModType_id char(32) NOT NULL,
    dmgType_id char(32) NOT NULL,
    PRIMARY KEY (id),
    KEY monster_dmg_mod_monster_id_fk_monsters_id (monster_id),
    KEY monster_dmg_mod_dmgModType_id_fk_dmgModTypes_id (dmgModType_id),
    KEY monster_dmg_mod_dmgType_id_fk_dmgTypes_id (dmgType_id),
    CONSTRAINT monster_dmg_mod_monster_id_fk_monsters_id
        FOREIGN KEY (monster_id)
        REFERENCES monsters (id),
    CONSTRAINT monster_dmg_mod_dmgModType_id_fk_dmgModTypes_id
        FOREIGN KEY (dmgModType_id)
        REFERENCES dmgModTypes (id),
    CONSTRAINT monster_dmg_mod_dmgType_id_fk_dmgTypes_id
        FOREIGN KEY (dmgType_id)
        REFERENCES dmgTypes (id)
)

这个功能,但感觉...坏。我想,我也可以做独立的表每个修饰类型的...

monster--|
         |-Resistance
dmg_type-|

monster--|
         |-Immunity
dmg_type-|

monster--|
         |-Vulnerability
dmg_type-|

......但是,这并不手感相当不错两种。是否有模拟这种行为的标准?

道歉,如果这是一个重复 - 我正在学习如何为我去形容这种事情的具体行话。

mysql database-design
1个回答
0
投票

@杰里米在评论到原帖投入是十分有益的。这似乎是在这种情况下,是不是一个真正的“正确”的方式来处理这种情况,而答案在很大程度上取决于上下文。在我的具体使用情况,我结束了与结样表来描述这种关系本身的关系,每个维度创建表:

monster------|
             |
dmg_type-----|--Junction (cols. for monster, dmg_mod_type, dmg_type)
             |
dmg_mod_type-|

在我的具体业务情况,我们很可能被添加或删除周期性调节剂(“添加dmg_mod_types”,因为它是),这使得它很容易的添加和根据需要进行删除。如果这些调节剂及其相关的值更静态的,它可能会更有意义,以打破他们分成不同的表,或实际上对列添加到“怪物”代表数据表中修改。

谢谢你的输入 - 我标志着这个问题进行封闭。

© www.soinside.com 2019 - 2024. All rights reserved.