项目sql表

时间:2011-09-30 23:01:33

标签: php mysql sql

我正在构建一个基于文本的游戏,我遇到了如何为项目构建/构建SQL表的问题。

物品可以是武器,水果,盔甲等等。但我不确定如何正确设计它。

  

例如

     

Iron Sword Str +4 Health +3

     

(或类似的东西)

     

但如果它是一个水果项目

     

健康的果实(笑)

     

享受+5健康


任何提示或想法?问题是如何构建此SQL表?

3 个答案:

答案 0 :(得分:3)

将不同类型的对象存储在不同的表中 为每个表提供适合其存储的对象类型的列。

CREATE TABLE Weapons (WeaponId INT PRIMARY KEY, Name VARCHAR(20), Strength INT);
CREATE TABLE Foods (FoodId INT PRIMARY KEY, Name VARCHAR(20), HealthBonus INT);

如果您希望所有类型的对象都有一些共同的属性,例如权重或购买价格,那么您可以创建一个具有这些共同属性的通用Items表。

CREATE TABLE Items (ItemId INT AUTO_INCREMENT PRIMARY KEY, 
  Weight NUMERIC(9,2), Cost NUMERIC(9,2));

您可以使其他表中的WeaponId和FoodId主键分别匹配Items中的一个ItemId值。当你想要创建一个新武器时,你首先Items添加一行,这将生成一个新的ItemId值,然后在插入{{1}时显式使用该值}。

请参阅Class Table Inheritance模式。


回答你的问题。

如果您要查询特定武器,可以加入:

Weapons

如果您要查询角色背包中的所有物品,则必须进行多次连接:

SELECT * FROM Items i JOIN Weapons w ON w.WeaponId = i.ItemId
WHERE w.Name = 'Iron Sword';

如果给定的项目与武器匹配但不匹配食物,则SELECT i.*, COALESCE(w.Name, f.Name, t.Name) AS Name, CONCAT_WS('/', IF (w.WeaponId, 'Weapon', NULL), IF(f.FoodId, 'Food', NULL), IF(t.TreasureId, 'Treasure', NULL) ) AS ItemType FROM Items i LEFT OUTER JOIN Weapons w ON w.WeaponId = i.ItemId LEFT OUTER JOIN Foods f ON f.FoodId = i.ItemId LEFT OUTER JOIN Treasure t ON t.TreasureId = i.ItemId etc.; 中的列将为空。希望给定的ItemId匹配仅在一个特定子类型表中使用的Id。另一方面,它允许给定物品既是武器又是食物(例如,纯素蛋糕,可以是有效的射弹; - )。

答案 1 :(得分:1)

听起来你需要一张属性表(力量,健康等)。然后是一个项目表(名称,描述等)以及将两者连接在一起的关联(显然是通过相关的id而不是用于规范化的文本链接,但这只是为了演示)。

Item        Attr  Value
Iron Sword  Str   +4
Iron Sword  Hlth  +3
Fruit       Hlth  +5

答案 2 :(得分:0)

上面给出了正确的回答..它们是不同的方法......第二个需要良好的OOP知识。

我想提及另一件事,我建议你阅读一些关于实体关系图设计的教程。我猜一个游戏,你可能需要学习一些基本的东西,所以我想你只需要几个小时。

在设计时有许多事情需要考虑......例如:

  1. 实体=逻辑上可以凭借自己的属性独立存在的东西:客户,供应商,学生,部门是一些强大的实体等。工作,属于等等不是实体,而是将实体联系在一起的关系

  2. 实体成为一个表格。强实体(没有依赖关系)成为具有简单主键的表,通常不接受任何外键。每次客户被删除时,电话号码都不是一个强有力的实体,电话没有任何诽谤,每次电话被删除时,客户仍然有意义。电话是一个属性,但由于多个值,它最终成为一个表。

  3. 所有这些都不是为了辅导设计,只是提到数据库设计不是轻描淡写,它可以拯救你或给你带来巨大痛苦......取决于你。