我有一个关于存储依赖项的数据库技术的问题。我知道有很多这样的方案,但我不能轻易地将它们放在我需要的方案中。我已经创建了简单的图像:

正如你所看到的,我需要的是创建一个技能树(就像在游戏中),这是相互依赖的。例如,如果有人想要拥有技能8,我可以告诉他,他需要首先拥有技能1,2和5。
这对于数据库中的层次结构数据可能是很好的,但我不太明白的是如何动态地执行此模型。我的问题是,技能会一直被添加到树中所有可能的位置。永远不会结束。技能可以添加到任何级别。
现在,在第一个问题之后,还有一个复杂的问题。我需要的技能也有水平。例如,技能1可以有10个等级。只有在达到技能1的5级之后,你才能达到技能2。
对于玩魔兽世界这样的游戏的人来说,这应该是可以理解的。
另请注意,技能可以随时添加,但添加后不能更改。在正常的基础上。只是为了防止某些技能非常糟糕或类似的情况,那么它将被移除,但这种情况很少发生。
感谢您的建议,链接或任何其他材料!
发布于 2012-05-03 12:18:06
我有足够的挑战来解决这个问题,但我没有足够的挑战来在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-03 11:56:47
正如你所看到的,我需要的是创建一棵技能树(就像在游戏中一样),这是相互依赖的。
我需要的技能也有水平。例如,技能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上使用它
https://stackoverflow.com/questions/10424047
复制相似问题