Ruby on rails 在rails中将列添加到表和连接表之间有什么区别?

Ruby on rails 在rails中将列添加到表和连接表之间有什么区别?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我最近发现,可以通过执行以下操作将列添加到Rails中的表中: rails generate migration add_lastname_to_users lastname:string 以前我常常连接表,这对我来说非常复杂,但添加列似乎可以完成相同的任务 为什么我要选择一个而不是另一个呢?我想这取决于您的应用程序,但通常最好是“规范化”您的数据库。也就是说,为特定对象定义单个表。用户表可能包含以下字段:user\u id,first\u name,&last\u name。然后,您可以在u

我最近发现,可以通过执行以下操作将列添加到Rails中的表中:

rails generate migration add_lastname_to_users lastname:string
以前我常常连接表,这对我来说非常复杂,但添加列似乎可以完成相同的任务


为什么我要选择一个而不是另一个呢?

我想这取决于您的应用程序,但通常最好是“规范化”您的数据库。也就是说,为特定对象定义单个表。用户表可能包含以下字段:
user\u id
first\u name
,&
last\u name
。然后,您可以在
user\u id
字段中加入。这会使您的查找速度更快,表也更小


我想这取决于您的应用程序,但通常最好是“规范化”您的数据库。也就是说,为特定对象定义单个表。用户表可能包含以下字段:
user\u id
first\u name
,&
last\u name
。然后,您可以在
user\u id
字段中加入。这会使您的查找速度更快,表也更小


这与rails和ActiveRecord关系不大,更多的是数据库设计问题
不需要太多细节:在关系数据库管理系统中,当您需要的某些信息已经在不同的位置(通常是另一个表)可用时(因此名称中的“关系”表示,表彼此相关并共享信息),您就可以连接表(或列)。您不想重复数据
这在NoSQL数据库中是不同的,在NoSQL数据库中,连接甚至可能不存在(MongoDB有嵌入文档的概念,在某些情况下,您将不得不重复数据)
在您的案例中,很容易(从数据库的角度来看)获取已经可用的信息(名字+姓氏)并返回该信息。添加具有相同信息的另一列似乎是“浪费”

您应该能够在模型中定义一个返回全名的helper方法,请参见

这与rails和ActiveRecord没有太大关系,而是数据库设计的问题
不需要太多细节:在关系数据库管理系统中,当您需要的某些信息已经在不同的位置(通常是另一个表)可用时(因此名称中的“关系”表示,表彼此相关并共享信息),您就可以连接表(或列)。您不想重复数据
这在NoSQL数据库中是不同的,在NoSQL数据库中,连接甚至可能不存在(MongoDB有嵌入文档的概念,在某些情况下,您将不得不重复数据)
在您的案例中,很容易(从数据库的角度来看)获取已经可用的信息(名字+姓氏)并返回该信息。添加具有相同信息的另一列似乎是“浪费”

您应该能够在模型中定义一个返回全名的helper方法,请参见表表示单个“实体”。在这种情况下,最好将
users.lastname
存储在同一个表中

另一方面,假设一个用户可以有许多电话号码。在这种情况下,最好将这些数据存储在一个单独的表中

换句话说,您希望避免这样做:

users.phone_number_1
users.phone_number_2
users.phone_number_3
这种方法的关键问题(如上面链接中更详细解释的)是:

  • 对于必须的用户,您将有许多冗余列。这会造成存储空间浪费和性能下降
  • 如果用户超过限制,则需要继续添加新列(例如,3个数字,因为有3列)
  • 查询数据变得更加困难。例如,假设您要查询“电话号码为X的所有用户”--您现在需要跨多个列进行搜索

相反,创建一个单独的
phones
表,该表通过
user\u id
列与用户连接。

表表示单个“实体”。在这种情况下,最好将
users.lastname
存储在同一个表中

另一方面,假设一个用户可以有许多电话号码。在这种情况下,最好将这些数据存储在一个单独的表中

换句话说,您希望避免这样做:

users.phone_number_1
users.phone_number_2
users.phone_number_3
这种方法的关键问题(如上面链接中更详细解释的)是:

  • 对于必须的用户,您将有许多冗余列。这会造成存储空间浪费和性能下降
  • 如果用户超过限制,则需要继续添加新列(例如,3个数字,因为有3列)
  • 查询数据变得更加困难。例如,假设您要查询“电话号码为X的所有用户”--您现在需要跨多个列进行搜索

相反,创建一个单独的
phones
表-该表通过
user\u id
列与用户连接。

。伙计们。我从来没有想到一个人可能有多个电话号码,可能需要更多的条目。我的
用户。phone_numer
示例不会在所有系统中都适用;你的问题之所以被搁置是因为“基于意见”。您的系统只会为每个用户存储一个电话号码是完全合理的-在这种情况下,将该值存储在同一个表中可能没问题!。。。但是,您可能还希望存储电话号码的更多属性,例如“类型”(移动/固定电话)、“国家代码”、“禁用”标志、“上次联系日期”。。。。。在这种情况下,一张单独的桌子更合适。伙计们。我从来没有想到一个人可能有多个电话号码,可能需要更多的条目。我的
用户。phone_numer
示例不会在所有系统中都适用;这是你为什么要这么做的原因