关于优化技能数据库表的建议

时间:2014-05-08 00:30:39

标签: mysql sql

我正在寻找关于如何优化表格的建议,所以我没有进行大量的连接。现在,我必须为一项技能执行3或4次连接,我的php将其转换为树形结构。任何人都可以给我提示如何减少连接,并建议任何方法来减少我正在使用的表的数量?我对游戏机制一无所知,我也不是一个优秀的数据库设计师。任何提示和/或建议都非常感谢。

统计:

use skilltree;

create table stats
(
    id int not null auto_increment,
    title varchar(28) not null,
    rate int default null, # default value for number
    txt varchar(38) default null, # allows stat to hold string value or number
    increase int, # amount to increase every level up unless string
    icon varchar(128), # path or url to icon, optional
    position int not null, # position used for display
    active int not null default 1, # is stat usable
    primary key(id)
)

技能:

use skilltree;

create table skills
(
    id int not null auto_increment, # id used for prereq 0 is root
    specialty int not null,# id to the specialty it belongs to
    title varchar(20) not null, # name of the skill
    description text not null, # what the skill does
    tiers int(5) not null default 1, # levels of advancement in skill, default 1, max 5
    prereq int default null, # used as parent id, looks better than parent
    icon varchar(128), # path or url to icon, shown in skill description view
    image varchar(128) not null, # path or url to image, image of the stat
    active int not null default 1, # if this skill is actve and needs to be added to the tree
    primary key(id) # auto_increment key has to be primary key
);

奖金:

use skilltree;

create table skillbonuses
(
    id int not null auto_increment,
    skill int not null, # id of the skill bonus belongs to
    stat int not null, # id of stat bonus applies to for this tier
    tier int(5) not null, # level of stat bonus applies to
    dependant int default 0, # dependant stat
    bonus int not null, # bonus amount as a percent
    primary key(id),
    foreign key(skill) references skills(id),
    foreign key(stat) references stats(id)
);

家属:

use skilltree;

create table skilldependants
(
    id int not null auto_increment,
    bonus int not null, # bonus that requires the check
    numequals int, # value to check if number
    txtequals varchar(38), # value check if stat is a string type
    primary key(id),
    foreign key(bonus) references skillbonuses(id)
);

1 个答案:

答案 0 :(得分:1)

加入不是邪恶的!

如果您的表格为normalized,那么您会发现许多查询涉及JOIN或多个JOIN。它们通常是保持表格良好状态的最有效方法,因为您不是重复数据。当您重复数据时,您可能会遇到麻烦。重复的数据越多,就越有可能被搞砸。复杂连接不会影响您的查询速度,因此唯一的潜在缺点是增加腕管综合征的风险。相反,较小的,更敏捷的表的另一种可能性是你最终得到一个表的巨大的野兽,在每一行重复多个值,并且 SLOW

您可以规范您减少表格的方式吗?

话虽如此,请阅读我所包含的链接并尝试理解它。具体来说,重点是,如果您有多个列(主键除外),它们显示在多个表中,您可以通过从其中一个表中删除它来标准化一点。同样地,如果你看几张桌子并意识到你永远不会打电话给另一张桌子,你可以期望将它们合并在一起并不会给你带来任何严重的问题。

然而,一眼就看出来,就像你一样。

其他削减编码的方法

话虽如此,你怎么能限制你写的这些查询的数量?

利用DRY原则。 AKA Don不要重复自己。如果您发现自己正在搜索代码以查找要在以后使用的查询,那么您将重复自己。

所有查询都应该在函数中。这样,当你想调用一个查询时,你实际上只是在调用一个函数。如果您的功能有详细记录,您会发现必须编写越来越少的查询。

希望这有帮助。