我们应该什么时候使用 one-to-one 关系模型与向相同的 table 添加属性?
When should we go for one-to-one relation model vs adding attributes to same table?
我正在使用 sails 框架构建网站,并 MySQL 作为我的数据库。
我有一个名为 "Property" 的 table。还有其他细节,如 "Total budget"、"Hold period"、"Rentable area"、"investor share"、"company share"、"sale price" 以及更多类似的相关属性以 one-to-one 的方式进入 属性。
我无法决定是否为这些详细信息创建单独的小 table(通过将它们分组在小 table 下,例如 "Equity"、"Funding"、 ...) 将 "Property ID" 作为每个小 table 的主键(在风帆上创建 one-to-one 关联)或简单地将所有这些作为 [=18= 下的属性] table。将它们作为属性添加到 "Property" table 会使 table 太大,大约有 40 列(这是个问题吗?)。
注意:所有这些属性都是强制性详细信息,而不是 "NULL" 任何时候。
我只会选择一个 table,特别是如果所有字段都是必填的。
你很far from the MySQL limit不会有问题的
您的代码将更易于编写和阅读。
对于 MySQL 性能也会更好,因为它在检索数据时不需要 JOIN
table 秒。
编辑。 one-to-one
关系可用于其他用例。例如,假设您有一个 table "animal",其中包含 "varchar name"、"integer age" 和 "decimal weight".
但是存储的动物可能有一些特定的属性存储在另一个 table 中,这取决于它们的家庭。
- a "dog" table 列 "integer owner_id", "enum breed"
- a "bird" table 列 "boolean can_fly", "integer number_of_eggs"
- a "fish" table 列 "integer number_of_gils", "boolean live_in_freshwater"
Rantanplan狗,Donald鸭子和Nemo鱼都可以存放在 "animal" table 中并将它们的特定属性存储在另一个具有 one-to-one
关系的 table 中。
这是一个愚蠢的例子,但它给出了一个用例的概念。
正如 Alexis N-o 指出的那样,您将通过单个 table 获得性能提升。 40 个属性并不多,尤其是对于业务逻辑。
但是,我想指出什么时候使用单独的 table 是有意义的。这主要归结为您的字段是要保持静态还是可能会发生变化。
例如,如果您确定 属性 中的唯一股份将是公司股份和投资者股份,则只保留两个字段。如果您认为您可能需要添加其他持有人,如果您稍后将它们包括在内会有点混乱(因为这些值都是强制性的)。
如果您使用的是 mongodb,则可以使用 array
或 json
类型来支持这种动态性。由于 mysql 本身并不支持它们,因此您最好为不同类型的共享创建 table,并将每个 Property
与尽可能多的 Share
相关联必需(Share
大致看起来像 [propertyId, shareType/shareTypeId, shareValue ])。
因此,尝试将您的属性分成不同的类别,看看每个类别中的成员是否会保持不变。如果您认为将来可能会附加任何类别,请将其作为单独的 table.
祝你好运!
我正在使用 sails 框架构建网站,并 MySQL 作为我的数据库。 我有一个名为 "Property" 的 table。还有其他细节,如 "Total budget"、"Hold period"、"Rentable area"、"investor share"、"company share"、"sale price" 以及更多类似的相关属性以 one-to-one 的方式进入 属性。
我无法决定是否为这些详细信息创建单独的小 table(通过将它们分组在小 table 下,例如 "Equity"、"Funding"、 ...) 将 "Property ID" 作为每个小 table 的主键(在风帆上创建 one-to-one 关联)或简单地将所有这些作为 [=18= 下的属性] table。将它们作为属性添加到 "Property" table 会使 table 太大,大约有 40 列(这是个问题吗?)。
注意:所有这些属性都是强制性详细信息,而不是 "NULL" 任何时候。
我只会选择一个 table,特别是如果所有字段都是必填的。
你很far from the MySQL limit不会有问题的
您的代码将更易于编写和阅读。
对于 MySQL 性能也会更好,因为它在检索数据时不需要 JOIN
table 秒。
编辑。 one-to-one
关系可用于其他用例。例如,假设您有一个 table "animal",其中包含 "varchar name"、"integer age" 和 "decimal weight".
但是存储的动物可能有一些特定的属性存储在另一个 table 中,这取决于它们的家庭。
- a "dog" table 列 "integer owner_id", "enum breed"
- a "bird" table 列 "boolean can_fly", "integer number_of_eggs"
- a "fish" table 列 "integer number_of_gils", "boolean live_in_freshwater"
Rantanplan狗,Donald鸭子和Nemo鱼都可以存放在 "animal" table 中并将它们的特定属性存储在另一个具有 one-to-one
关系的 table 中。
这是一个愚蠢的例子,但它给出了一个用例的概念。
正如 Alexis N-o 指出的那样,您将通过单个 table 获得性能提升。 40 个属性并不多,尤其是对于业务逻辑。
但是,我想指出什么时候使用单独的 table 是有意义的。这主要归结为您的字段是要保持静态还是可能会发生变化。
例如,如果您确定 属性 中的唯一股份将是公司股份和投资者股份,则只保留两个字段。如果您认为您可能需要添加其他持有人,如果您稍后将它们包括在内会有点混乱(因为这些值都是强制性的)。
如果您使用的是 mongodb,则可以使用 array
或 json
类型来支持这种动态性。由于 mysql 本身并不支持它们,因此您最好为不同类型的共享创建 table,并将每个 Property
与尽可能多的 Share
相关联必需(Share
大致看起来像 [propertyId, shareType/shareTypeId, shareValue ])。
因此,尝试将您的属性分成不同的类别,看看每个类别中的成员是否会保持不变。如果您认为将来可能会附加任何类别,请将其作为单独的 table.
祝你好运!