我试图设计一个尽可能可伸缩的数据库,所以我用一个简单的场景来测试这个概念。
假设我有一张桌子。触点通常具有contact
、address
、phone number
和mobile number
。
单个表可以保存此信息。但是,如果一个联系人有多个这样的细节呢?我的解决方案是使用这样的连接表:
contact -* contact_address *- address
contact -* contact_phone *- phone
contact -* contact_mobile *- phone
contact -* contact_emailaddress *- emailaddress
这将允许我获取有关联系人的所有信息。
此外,
email address
、address
和phone
表成为数据库,用于从分析到简单地重用数据的目的。但是,我还不知道这会对性能产生什么影响,以及这是否是一个好的实践,主要是因为
emailaddress
表只包含一个contact
而不包含其他内容。有一点需要注意,这使用doctrine2和symfony2,因此编写长查询不会成为问题,我主要关心的是上面的问题,这已经从一个表跳到了八个表,而contacts只是我需要使用这种模式的一个方面。
最佳答案
这完全可以使用,你根本不用担心。
唯一的问题是如果你允许条令延迟加载关系。例子:
如果你
$contact = $repository->find(1) ;
稍后在模板中,您可以执行以下操作
{% for email in contact.emails %}
{{ email.address }}
{% endfor %}
此代码将触发另一个select语句。现在,如果显示的是每页10个联系人,则意味着将执行另外10个查询。
如果你显示了地址或电话号码之类的其他信息,就要计算一下。
为了避免这种延迟加载,您需要在查询中加入它们。就像
// ContactRepository
public function findForSomePage()
{
return $this->createQueryBuilder("o")
->leftJoin("o.addresses", "a")->addSelect("a")
.... other joins ...
->getQuery()
->getResult()
}
现在,显示所需的所有内容都将在1个查询中获取。
关于sql - 仅具有ID和许多联结表的表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16459263/