一般来说,我希望尽可能保持数据库的清洁和可扩展性。
然而,在做了一些测试之后,我意识到尽管这通常是最好的方法,但在处理大型数据集时,它比我所说的“脏”方法更慢。
基本上可以说我有一个对象表。这些物品属于某些人。一个对象可能有一个人,而其他人超过1.我最初的想法就像我一直做的那样,为我的对象创建一个对象表,为我的人创建一个人员表,然后是一个object_to_people链接表。
但是,为了获取一个人被分配到的所有对象,加入对象和链接器表可能需要3秒钟(这基于大约400k记录,但每个对象只有1个链接)。是的我也建立了索引的e.c.t.试着加快速度。
如果我改为删除人员和链接器表,并将对象表中的人员作为列并使用1/0设置是否将每个人分配给该对象,而不加入两个大表我看到的速度为大约0.3 - > 0.7秒(变化很大)。
首先,我们只需要2个人。但如果我能帮助它,我不想过于严格。我知道我可以使用缓存以及什么不能改善最终用户的时间,但是有什么理由认为使用列而不是链接表是一个非常糟糕的主意吗?
答案 0 :(得分:2)
我有类似的设置 我的连接表有17,000,000行。我的“人”表有8,400,000行,而我的“对象”表有300,000行。
我的连接表上有多个连接的查询和返回数万行的结果联合,运行时间不到1秒(50-400ms)。
我认为您的第一个布局可能没问题,但您可能需要关注索引和查询。
答案 1 :(得分:0)
但是有什么理由认为这是一个非常糟糕的主意 使用列而不是链接表?
如果您认为可扩展性超过您获得的性能,那么我认为这是一个非常糟糕的想法。
如果您重视获得的性能而不是可扩展性,我会说这是一个非常好的想法。
答案 2 :(得分:0)
如果确实一个对象可以同时属于多个人...则保留链接表。
答案 3 :(得分:0)
同样在mysql alter table
中,巨大的表可以执行非常长的时间,因此在合理的时间内无法在应用程序中添加新用户。