4

依存関係を保存するためのデータベース手法について質問があります。それらがたくさんあることは知っていますが、必要なスキームに簡単に配置することはできません. 簡単な画像を作成しました:

スキル例

ご覧のとおり、必要なのは、相互に依存する (ゲームのような) スキルのツリーを作成することです。たとえば、誰かが行ってスキル 8 を取得したい場合、まずスキル 1、2、および 5 を取得する必要があると伝えることができます。

これは、データベース内の階層データには問題ないかもしれませんが、このモデルを動的に実行する方法がよくわかりません。私が抱えている問題は、スキルがツリー内のすべての可能な場所に常に追加されることです。終わりのない。スキルはどのレベルでも追加できます。

この最初の質問の後に、もう 1 つ複雑な問題があります。スキルにもレベルが必要です。たとえば、スキル 1 には 10 レベルを設定できます。スキル 1 レベル 5 を達成した後にのみ、スキル 2 を達成できます。

World of Warcraft のようなゲームをプレイする人にとっては理解できるはずです。

スキルはいつでも追加できますが、追加後に変更することはできません。正常に。万が一、スキルが極端に悪いとかそういう場合は削除されるのですが、それは極稀にしか発生しません。

提案、リンク、またはその他の資料をありがとう!

4

2 に答える 2

1

ご覧のとおり、必要なのは、相互に依存する (ゲームのような) スキルのツリーを作成することです。

スキルにもレベルが必要です。たとえば、スキル 1 には 10 レベルを設定できます。

これは、基本的に、スキルとスキルの最大レベルを格納するテーブルが必要になることを意味します。

create table skills(
  skill_id integer,
  skill_name varchar(500) not null,
  skill_max_level integer not null,
  primary key(skill_id));

また、オプションのレベルが必要な依存関係を設定する必要があります。

create table skills_depend
( skill_id integer
, skill_depend integer
, level_depend integer 
, primary key(skill_id, skill_depend)
, foreign key (skill_id)
  references skills (skill_id)
, foreign key (skill_depend)
  references skills (skill_id) );

クエリは、何を確認するかによって異なります (たとえば、ユーザーがスキルを習得するための前提条件を持っているかどうかなど)。

これをユーザーレベルと彼がすでに持っているスキルと組み合わせると、それが出発点だと思います.

スキルはいつでも追加できますが、追加後に変更することはできません。正常に。スキルの一部が極端に悪いなどの場合に備えて削除されますが、それはごくまれに発生します。

この要件は、アプリケーション レベルで制御する必要があります (ユーザーにスキルの追加または削除のみを許可します)。


SQLFiddleでこれを試すことができます

于 2012-05-03T03:56:47.307 に答える
1

私は問題を解決するのに十分挑戦していますが、MySQL でそれを解決するのに十分挑戦していません。それを念頭に置いて、問題の Postgresql バージョンを次に示します。

with recursive 
skill_list(skill_id) as
(
    select distinct skill_id from skill_req 
    where req is not null
    union
    select distinct req from skill_req
    where req is not null 
)
,skill_tree(skill_group, depend_on) as
(
    select skill_id, skill_id -- seeds
    from skill_list         
    union       
    select st.skill_group, sr.req
    from skill_req sr
    join skill_tree st 
    on sr.skill_id = st.depend_on 
)
,skills_required as
(
    select skill_group, depend_on
    from skill_tree
    where skill_group <> depend_on -- remove seeds  
)
select 
    sl.skill_id, 
    array_agg(sr.depend_on order by depend_on) as array_version,
    array_to_string(array_agg(sr.depend_on order by depend_on), ',') 
        as group_concat_version    
from skill_list sl
left join skills_required sr on sr.skill_group = sl.skill_id
group by sl.skill_id  

データ:

CREATE TABLE skill_req
    (skill_id int, req int);

INSERT INTO skill_req
    (skill_id, req)
VALUES   
   (2, 1),

   (4, 3),

   (5, 1),

   (6, 4), 
   (6, 2),

   (7, 6),   
   (7, 9),

   (8, 2),
   (8, 5),

   (9, 3),

   (10, 4),
   (10, 5),
   (10, 9);

出力:

 skill_id | array_version | group_concat_version 
----------+---------------+----------------------
        1 | {NULL}        | 
        2 | {1}           | 1
        3 | {NULL}        | 
        4 | {3}           | 3
        5 | {1}           | 1
        6 | {1,2,3,4}     | 1,2,3,4
        7 | {1,2,3,4,6,9} | 1,2,3,4,6,9
        8 | {1,2,5}       | 1,2,5
        9 | {3}           | 3
       10 | {1,3,4,5,9}   | 1,3,4,5,9
(10 rows)

ライブ テスト: http://www.sqlfiddle.com/#!1/77894/1

于 2012-05-03T04:18:05.633 に答える