我正在开发一个项目,我希望类别“Items”在 MySQL 中具有子实体。
在我的情况下,主要实体称为“项目”,但是我需要将它们分成更小的部分,例如:
- 消耗品
- 药物
- 装备/工具
- 盔甲
- 远程武器
- 近战武器。
这些子实体还需要一些子实体。例如远程武器需要子实体:
- 火焰武器
- 原始武器
- 启动器
- 手榴弹
- 奇异武器
我尝试过搜索它,但似乎找不到任何解决方案。我如何设计这些实体?
此外,当我执行简单的 SELECT * FROM item 时;然后它会显示所有子类别中的所有项目吗?
或者它只会显示那些直接插入到项目实体中的内容?
最佳答案
有几种方法可以处理这个问题。
一,创建一个项目表,其中包含与每行关联的相关 ID。
例如,
id,type,category,subcategory
1, item, NULL, NULL
2, item, Consumables, NULL
3, item, Drugs, NULL
.
.
.
x, item, Ranged Weapons, NULL,
.
.
.
y,item, Ranged Weapons, Flame weapons
z,item, Ranged Weapons, Primitive weapons
虽然这个表很容易查询,但它也很难维护。另外,如果您不存储 id 而是存储文本值,它会很快变大(并且更难以维护)
现在,另一个选择是使用树结构。为此,您可以尝试创建如下所示的项目表:
id,name,level,parent_id
0, Items,0,NULL
1,Consumables,1,0
2,Drugs,1,0
.
.
.
x,Ranged weapons,1,0
.
.
.
y,Flame weapons,2,x
z,Primitive weapons,2,x
在此表下,您可以查询 WHERE Parent_id = x 的项目(换句话说,远程武器)。您可能需要稍微嵌套查询,具体取决于您有多少级别。但逻辑通常相当简单。
如果我只有几个级别,就像您所描述的那样(一些含义不是 10、20 或 100),那么毫无疑问我会像第二个示例那样创建树结构。如果您确实有多个级别,则需要考虑将针对其运行的实际查询,并可能查看各种范式 ( http://en.wikipedia.org/wiki/Database_normalization ) 来表示您的数据。
不过,同样,只有几个级别,我会立即构建这个东西的树形结构。它会更容易维护,并且只要您最终不必在树上爬上几个级别,您就不应该遇到任何性能问题(假设良好的索引、良好的查询等)
希望这有帮助。
关于MySQL 子实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23619899/