language-agnostic - 表设计和类层次结构

标签 language-agnostic database-design orm 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;
}

现在,当对表进行建模以与此类层次结构同步时,我采用了非常相似的方法:

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

我遇到的问题是试图弄清楚如何将每个 Card 记录与相应表中包含其详细信息的记录相关联。具体来说,如何确定我应该查看哪个表。

我应该在 Card 中添加一个 VARCHAR 列来保存关联表的名称吗?这是我和我的同龄人达成的唯一解决方案,但它似乎太“肮脏”了。 保持设计的可扩展性是这里的关键,允许轻松添加新的子类

如果有人可以提供一个示例或资源来展示一种清晰的镜像类/表层次结构的方式,我们将不胜感激。

最佳答案

谷歌“泛化特化关系建模”。您将找到几篇关于如何使用关系表对 gen-spec 模式建模的优秀文章。在 SO 中已经多次提出同样的问题,但细节略有不同。

最好的这些文章将确认您的决定,即使用一个表来存储通用数据,而使用单独的表来存储专业数据。最大的不同是他们推荐使用主键和外键的方式。基本上,他们建议专用表有一个具有双重职责的单列。它作为专用表的主键,但它也是复制通用表的 PK 的外键。

这维护起来有点复杂,但在加入时非常甜蜜。

还请记住,将新类添加到层次结构时需要 DDL。

关于language-agnostic - 表设计和类层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4142536/

相关文章:

c# - 什么是异常(exception)?

language-agnostic - 日志库有什么用?

language-agnostic - 从方法返回子类或接口(interface)实现的最佳实践是什么?

database - PostgreSQL Schemas -- 使用场景/案例

python - Django 模型 - 如何过滤 ForeignKey 对象的数量

language-agnostic - 除了缩进代码,还有其他选择吗?

php - 帮我为 iou Web 应用程序设计数据库架构

java - Hibernate 执行太多查询

c++ - 使用哪个C++数据库或ORM API?

java - EJB环境下如何使用外部文件进行数据库配置