我有以下数据结构:
一个客户可以有多次访问,每次访问可以有多个订单,有些订单可以没有访问,直接链接到客户。
我应该以一对多关系将客户端链接到订单吗? 或者我应该删除该关系并创建一个虚拟访问来访问商店订单而无需访问。
列出所有订单的最佳性能解决方案是什么? getClient.getOrders 或 getClient.getVisits.getOrders
列出客户怎么样,如果客户有很多关系,会影响速度吗?
如果访问有订单,然后订单有付款,然后付款有多张发票,该怎么办?在这种情况下,我非常确定没有必要在客户和发票之间建立关系。
我正在使用基于 SQLite 的核心数据 (iOS)。由于核心数据非常慢,可能会切换到另一个解决方案。
最佳答案
我非常支持对现实世界进行建模。如果存在没有访问的订单,那么您不应该创建“虚拟”访问,只是为了将数据硬塞到未正确设计以匹配现实世界的结构中。当用户想要查看去年的访问次数时会发生什么?现在他们必须记住对那些“虚拟”访问打折扣。您应该考虑过早优化,因为这似乎也适用于此。
我将创建一个从“订单”到“客户”的外键,以及一个从“订单”到“访问”的外键,但使用 NULL
可 visit_id
以便外键是可选的。在许多数据库中,您还可以在访问中的 visit_id
和 client_id
上创建备用键(或唯一索引),然后使用订单中的外键。这样,如果它是没有访问的订单,则不会强制执行该行的外键。在 SQL Server 中,其中一列为 NULL 的事实足以告诉它不要强制执行该外键,但我不知道是否所有 RDBMS 都以相同的方式工作。如果不这样做,您可能必须使用索引 View 或其他一些复杂的方法来强制引用完整性。
关于mysql - 我应该在数据库中创建与第二级子级的关系,什么是最佳的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35655848/