Database design 避免原则2中引用/查找表的联接

Database design 避免原则2中引用/查找表的联接,database-design,join,doctrine,doctrine-orm,lookup-tables,Database Design,Join,Doctrine,Doctrine Orm,Lookup Tables,在我的应用程序中,我有许多简单的引用/查找数据库表,用于提供相关表中允许值的列表 (您知道,“国家”表中有地址表“国家”字段中允许的国家列表…) 为了使数据模型尽可能精简,我使用“”跳过查找表中的“id”列,只使用实际值作为主键。这样,您就不需要执行联接来获取主表中的值,因为它已经作为外键存在 问题是,条令对所有关联使用对象引用,这意味着查询仍然需要连接到查找表——即使主表已经具有我需要的值 例如,此查询不起作用: $qb->select(array('a.id', 'a.street',

在我的应用程序中,我有许多简单的引用/查找数据库表,用于提供相关表中允许值的列表

(您知道,“国家”表中有地址表“国家”字段中允许的国家列表…)

为了使数据模型尽可能精简,我使用“”跳过查找表中的“id”列,只使用实际值作为主键。这样,您就不需要执行联接来获取主表中的值,因为它已经作为外键存在

问题是,条令对所有关联使用对象引用,这意味着查询仍然需要连接到查找表——即使主表已经具有我需要的值

例如,此查询不起作用:

$qb->select(array('a.id', 'a.street', 'a.city', 'a.country'))
   ->from('Entity\Address', 'a');
相反,您必须这样做:

$qb->select(array('a.id', 'a.street', 'a.city', 'c.country'))
   ->from('Entity\Address', 'a')
   ->join('a.country', 'c');
否则会出现以下错误:“无效的PathExpression。必须是StateFieldPathExpression。”

加上查找表所需的所有联接,我的查询中会有很多不必要的开销

有没有人知道一种好方法可以避免在原则2中执行查找/引用表的连接


(顺便说一句——我宁愿避免使用枚举,因为它们是和有其他的。)

是的,这种类型很糟糕,但我想他们这样做有很好的理由

您可以使用
HINT\u INCLUDE\u META\u列
HINT。它将包括查询结果中的所有字段,包括映射为关系的外键

$query = \Doctrine::em()->createQuery($queryString)
    ->setParameters($params)
    ->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, TRUE);

因此,如果您在数据库的
Address
表中有一个字段
city\u id
,那么它也将与“标准”城市关系一起输出到查询结果中。

这太棒了-我不知道setHint()方法,也不打算好好使用它。setHint用于各种东西,不仅仅包括元列。这是一种附加查询遍历器的方法,该遍历器在每次查询时都会执行。你也可以做你自己的提示,你想做什么就做什么。不错的小东西,不是吗;)警告:原则不包括持有null的外键。比如,如果城市id不是强制性的,它就不会一直存在。只需花2小时在上面,认为这是缓存问题:)