如何将分解为数据库的模型构建为36个表?

Jac*_*cob 11 postgresql ruby-on-rails ruby-on-rails-5

我有超过10亿个域名记录,而不是将它们全部放在一个表中,我决定将它们分成36个表(每个表的数据库结构相同).

有一个基于域名第一个字符的表(ex tables:domains_a... domains_z).

如何Domain在rails中创建单个模型,根据指定的字符自动在这些表之间切换?

Fir*_*DoL 2

你不能:你必须编写自己的逻辑来处理这个问题。Rails 需要了解您的业务逻辑并分析 SQL 查询以找出要选择哪个表,但默认情况下无法做到这一点,您需要自己编写该代码。

然而,有一个技巧可以让你变得非常容易。在数据库级别处理这个问题怎么样?我已经检查过,所有主要数据库都支持可更新视图

因此,创建一个新视图,为其命名domains并确保它创建所有域表(从 a 到 z)的并集,然后创建一个模型:

class Domain
  self.table_name = "your_view_name"
end
Run Code Online (Sandbox Code Playgroud)

这对于read side来说可以起到作用。现在,根据您使用的数据库,您也许可以通过这种方式解决写入问题(使用触发器和类似的数据库功能),否则,您需要为写入部分编写自己的代码,这可能需要运行原始查询。

作为替代方案,您可以在 Ruby 级别处理此问题,方法是手动或使用生成器创建所有模型(DomainADomainB等),然后创建充当接口的公共类。或者,您可以使用一些元编程来创建这些模型,并再次拥有一个充当接口的公共类。