【发布时间】:2010-11-26 23:20:27
【问题描述】:
我正在尝试使用 MySQL 为游戏制作一个简单的项目数据库。这是我的 3 张桌子的样子
项目 项目 ID |项目名称 ------------------ 0001 |胸片 0002 |剑 0003 |头盔 属性(属性查找表) 属性 ID |属性名 --------------------------------- 01 |力量 02 |敏捷 03 |智力 04 |防御 05 |损害 06 |法力 07 |耐力 08 |描述 09 |类型 item_attributes(联结表) 项目 ID |属性 ID |价值(混合型,不好?) ---------------------------------- 0001 | 01 | 35 0001 | 03 | 14 0001 | 09 |盔甲 0001 | 08 |由令人敬畏的精灵制作 0002 | 09 |武器 0002 | 05 | 200 0002 | 02 | 15 0002 | 08 |你的平均剑 0003 | 04 | 9000 0003 | 09 |盔甲 0003 | 06 | 250我对这个设计的问题是item_attributes表中的value列需要使用varchar数据类型,因为值的数据可以是int、char、varchar。我认为这是一种不好的方法,因为我无法根据特定属性快速对我的项目进行排序。当处理诸如 获取属性强度值在 15 到 35 之间的项目 之类的查询时,它也会受到性能影响。
这是我的潜在解决方案。我只是在attributes 表中添加了一个data_type 列。所以它看起来像这样
然后我会在item_attributes 表中再添加 3 列,int、char、varchar。这是新的item_attributes 表的外观。
所以现在如果我要根据其strength 属性对项目进行排序,我将使用int 列。或者根据描述搜索一个项目,我会搜索varchar 列。
但是,我仍然认为我的设计有点奇怪。现在我必须查找attribute 表中的data_type 列,并动态确定item_attributes 表中的哪一列与我要查找的内容相关。
任何意见将不胜感激。
提前致谢。
编辑 2010 年 11 月 29 日 这是我的物品的详细清单
-------------------------------------- http://wow.allakhazam.com/ihtml?27718 奥尔多防御者腿甲 拾取时绑定 腿板 802护甲 +21 力量 +14 敏捷 +21 耐力 物品等级 99 装备: 命中等级提高14。 -------------------------------------- http://wow.allakhazam.com/ihtml?17967 精致的奥妮克希亚鳞片 皮革 物品等级 60 -------------------------------------- http://wow.allakhazam.com/ihtml?27719 奥多强悍护腿 拾取时绑定 腿皮革 202 护甲 +15 敏捷 +21 耐力 物品等级 99 装备: 增加28点攻击力。 装备: 命中等级提高20。 -------------------------------------- http://wow.allakhazam.com/ihtml?5005 余烬火花吊坠 装备时绑定 颈部杂项 +2 耐力 +7 精神 需要 30 级 物品等级 35 -------------------------------------- http://wow.allakhazam.com/ihtml?23234 敏捷的蓝布赖恩石 宝石 需要 2 级 物品等级 10 +8 敏捷 -------------------------------------- http://wow.allakhazam.com/ihtml?32972 啤酒护目镜 拾取时绑定 独特 头杂 物品等级 10 装备: Belbi Quikswitch 保证让每个人看起来都有吸引力! -------------------------------------- http://wow.allakhazam.com/ihtml?41118 加基森礼物 拾取时绑定 独特 物品等级 5 “请回到赛季组织者那里” -------------------------------------- http://wow.allakhazam.com/ihtml?6649 灼热图腾卷轴 独特 任务物品 需要 10 级 物品等级 10 采用: -------------------------------------- http://wow.allakhazam.com/ihtml?6648 石肤图腾卷轴 独特 任务物品 需要 4 级 物品等级 4 采用: -------------------------------------- http://wow.allakhazam.com/ihtml?27864 布莱恩的扩展成本复制的布莱恩特 宝石 物品等级 10 宝石测试附魔 --------------------------------------编辑#2
- 这 10 个示例并不代表我收集的所有 35316 个项目数据。
- NeckMiscellaneous 表示该项目属于“Neck”和“Misc”两个类别。
- 唯一意味着角色上只能使用一项。
- 不要过多解读“行动”,它们只是任务描述
- 当一个项目显示“装备:增加 28 点攻击力”时,它仅表示玩家角色的攻击力+28。与 +15 敏捷相同。
这是一个查询的示例
选择 * 来自 itemattributestat 其中 item_itemId=251 item_itemId |属性_attributeId |价值 |列表顺序 ==================================================== ===== “251”、“9”、“0”、“1” “251”、“558”、“0”、“2” “251”、“569”、“0”、“3” '251'、'4'、'802'、'4' “251”、“583”、“21”、“5” “251”、“1”、“14”、“6” “251”、“582”、“21”、“7” “251”、“556”、“99”、“8” “251”、“227”、“14”、“9”这里的列表顺序是为了跟踪应该首先列出哪个属性。用于格式化目的
创建视图 itemDetail 作为 选择 Item_itemId 作为 id,i.name 作为项目,a.name 作为属性,值 from ((itemattributestat join item as i on Item_itemId=i.itemId) 加入属性作为 Attribute_attributeId=a.attributeId) 按 Item_itemId asc、listOrder asc 排序;上面的视图产生以下内容
选择 * 来自itemdetail 其中 id=251; 编号 |项目 |属性 |价值 '251', 'Aldor Defender''s Legplates', '拾取时绑定', '0' '251', 'Aldor Defender' 的腿甲', '腿', '0' '251', 'Aldor Defender''s Legplates', 'Plate', '0' '251', 'Aldor Defender''s Legplates', 'Armor', '802' '251', 'Aldor Defender''s Legplates', '力量', '21' '251', 'Aldor Defender''s Legplates', 'Agility', '14' '251', 'Aldor Defender''s Legplates', 'Stamina', '21' '251', 'Aldor Defender''s Legplates', '物品等级', '99' '251', 'Aldor Defender''s Legplates', 'Equip: 将命中率提高@@.', '14'值为 0 的属性表示属性名称代表项目类型。 'Equip: Improves hit rating by @@.', '14' @@ 在这里是占位符,在浏览器上处理后的输出将是'Equip: Improves hit rating by 14.'
【问题讨论】: