簡體   English   中英

在同一個表上處理多個多對多關系?

[英]Handling multiple many-to-many relationships on same table?

我是偶然的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-|

...但是那也不是很正確。 有沒有為這種行為建模的標准?

抱歉,如果這是重復的話,我正在學習如何描述這種事情的專門術語。

@Jeremy在原始帖子的評論中的輸入非常有啟發性。 在這種情況下,似乎並沒有真正解決這種情況的“正確”方法,而答案很大程度上取決於具體情況。 在我的特定用例中,我最終為關系的每個維度創建了一個表,並使用一個類似結的表來描述關系本身:

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

在我的特定業務案例中,我們很可能會定期添加或刪除修飾符(就像以前那樣“添加dmg_mod_types”),這使得根據需要添加和刪除非常容易。 如果這些修飾符及其相關值更加靜態,則將它們分成單獨的表,或者確實在“怪物”表中添加一列以表示修飾符可能更有意義。

感謝您的輸入-我將此問題標記為已結束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM