我正在为一个应用程序设计后端,该应用程序可以跟踪几个不同的餐厅及其订购历史。因此,我一直在考虑最有效的方法。我想我想为任何一家餐厅设计一个通用的设计,并在我们添加不同的餐厅时创建一个新的数据库。 (请让我知道这样做是否有问题)
我要弄清楚的是我将如何存储许多订单的餐馆的特定订单数据。我当时想用一张大桌子来跟踪所有订单,并为每个订单创建一个单独的迷你表,详细说明已订购的商品,价格以及是否有折扣/优惠券。
我想象一个餐厅在一个月内可以收到成千上万的订单,所以最后我有了成千上万的带有单独订单的迷你桌子。我还考虑将所有订单的每个项目都填满的表格,并在每个订单上附加一个order_id。但是那时我将拥有一个每月最多可容纳成千上万个条目的表。
哪种方法最有效?当然,这两个实现想法都可能相去甚远,因此我愿意听取其他任何想法或想法!
答案 0 :(得分:1)
当您实际上不需要设计时,请不要牺牲其性能。这只会带来不必要的复杂性。只需尝试以BCNF或3NF之类的常规形式设计实体。然后,在您设计了实体之后,一切看起来都很好。
然后,有许多解决方案可用于性能调整和扩展。
第一个是indexing,通过建立索引,可以节省很多计算能力。因为查询没有索引的数据库是O(n)
,并且是通过索引查询的,所以您可以让O(log(n))
甚至O(1)
取决于所使用的索引算法。
下一个解决方案是partitioning表。可以将其视为将表分为许多表,但是数据库将其抽象化,因此您只能看到一个表。
这两个第一个解决方案可帮助您在一台计算机上调整性能。在扩展机器的同时,可以帮助您获得更好的性能。对此有硬件限制。因此,如果必须横向扩展,可以进行复制和sharding。
基本上,replication可帮助您扩展读取查询。有一些复制解决方案可以扩展写查询,但是它们并不是非常有效,因为它们必须在集群中的所有机器上写一件事。尽管它们是高可用性的完美解决方案。
因此,如果达到一定水平,那么您的写操作太多了,那么复制就不再有用了。您可以转到分片。分片有很多方面。分片应该在应用程序级别还是数据库级别进行?以及如何在机器之间划分数据?
对于我自己,我更喜欢数据库级分片(并且实际上在生产中使用它)。因为应用程序级分片可能会使应用程序服务器代码变得复杂(因为您可能需要服务发现等),并且如果处理不当,甚至会变得很脏。同样,抽象可以帮助开发人员将集群视为一个数据库,而不是许多分散的数据库。
用于在分片之间划分数据。有垂直分片和水平分片。
在垂直分片中,您按实体将数据划分为一个数据库中的客户,而在另一个数据库中按订单等。 这应该是第一种方法,因为它比水平分片要容易得多。
在水平分片中,您在多个数据库服务器之间划分了一个实体。例如,您可以使用公式对行进行平均划分,就像ID奇数的行进入实例A,ID偶数的行进入实例B。
另一种方法是将它们划分为一些常见的东西,例如按餐厅划分订单。
希望有帮助。如果您还有其他问题,我很乐意回答。