我正在构建一个基于文本的游戏,我遇到了如何为项目构建/构建SQL表的问题。
物品可以是武器,水果,盔甲等等。但我不确定如何正确设计它。
例如
Iron Sword Str +4 Health +3
(或类似的东西)
但如果它是一个水果项目
健康的果实(笑)
享受+5健康
任何提示或想法?问题是如何构建此SQL表?
答案 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知识。
我想提及另一件事,我建议你阅读一些关于实体关系图设计的教程。我猜一个游戏,你可能需要学习一些基本的东西,所以我想你只需要几个小时。
在设计时有许多事情需要考虑......例如:
实体=逻辑上可以凭借自己的属性独立存在的东西:客户,供应商,学生,部门是一些强大的实体等。工作,属于等等不是实体,而是将实体联系在一起的关系
实体成为一个表格。强实体(没有依赖关系)成为具有简单主键的表,通常不接受任何外键。每次客户被删除时,电话号码都不是一个强有力的实体,电话没有任何诽谤,每次电话被删除时,客户仍然有意义。电话是一个属性,但由于多个值,它最终成为一个表。
所有这些都不是为了辅导设计,只是提到数据库设计不是轻描淡写,它可以拯救你或给你带来巨大痛苦......取决于你。