Dan*_*ugg 2 language-agnostic orm database-design class-hierarchy
希望有人可以通过一个例子或者一些建议的阅读来解释这个问题.我想知道在类层次结构等效之后建模表的最佳设计方法是什么.这可以通过一个例子来描述:
abstract class Card{
private $_name = '';
private $_text = '';
}
class MtgCard extends Card{
private $_manaCost = '';
private $_power = 0;
private $_toughness = 0;
private $_loyalty = 0;
}
class PokemonCard extends Card{
private $_energyType = '';
private $_hp = 0;
private $_retreatCost = 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,在建模表以与此类层次结构同步时,我已经使用了非常类似的东西:
TABLE Card
id INT, AUTO_INCREMENT, PK
name VARCHAR(255)
text TEXT
TABLE MtgCard
id INT, AUTO_INCREMENT, PK
card_id INT, FK(card.id)
manacost VARCHAR(32)
power INT
toughness INT
loyalty INT
TABLE PokemonCard
id INT, AUTO_INCREMENT, PK
card_id INT, FK(card.id)
hp INT
energytype ENUM(...)
retreatcost INT
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是试图弄清楚如何将每条Card记录与包含相应表格中的详细信息的记录相关联.具体来说,如何确定我应该查看哪个表.
我应该添加一VARCHAR列来Card保存关联表的名称吗?这是我和我的同事唯一解决的问题,但它似乎太"脏"了.保持设计可扩展性是关键,允许轻松添加新的子类.
如果有人可以提供显示镜像类/表层次结构的简洁方法的示例或资源,那么将非常感激.
谷歌"泛化专业化关系建模".您将找到几篇关于如何使用关系表对gen-spec模式建模的优秀文章.在SO中已经多次询问过同样的问题,细节略有不同.
这些文章中最好的将确认您决定为一般数据设置一个表,为特殊数据设置单独的表.最大的区别将是他们推荐使用主键和外键的方式.基本上,他们建议专门的表有一个单独的列,可以执行双重任务.它作为专用表的主键,但它也是一个外键,它复制了通用表的PK.
维护起来有点复杂,但在加入时它非常甜蜜.
还要记住,在将新类添加到层次结构时需要DDL.