多种类型实体的数据库设计与 TypeOrm 一起使用
Database design for multiple types of entities to use with TypeOrm
我有几种类型的用户:FIGHTER、JUDGE、SPECTATOR、PROMOTER,LOCATION_PROVIDER。
它们都有一些参数,有些是通用的,有些是特定的。我的理由是,为每种类型的用户设置一个单独的 tablea 是合乎逻辑的。每个这样的 table 只会存储与特定类型的用户数据相关的数据。
据我从此处提供的文档中可以看出:
https://github.com/typeorm/typeorm/blob/master/docs/entity-inheritance.md
TypeOrm 提出了一些暗示继承的解决方案,但它们都是关于减少代码量的。例如,名为 Single Table Inheritance 的模式允许在代码方面对实体进行一些分离,但是所有类型的用户都将被转储到单个 table],从模式的名称中可以看出这一点。其他解决方案对我来说并不好。
我正在考虑创建一个 table users
来存储通用数据,然后创建所有其他 table 来存储特定类型的数据。
例如,
user
有first_name
、second_name
、age
.
等字段
fighter
有weight
、wins
、losses
、draws
、
等字段
但问题是这些table恰好是不相关的。那么这是否意味着我必须编造一些使它们相关的逻辑?不确定我是否了解如何最好地处理它。
此类问题的最佳答案是:视情况而定。说真的,这取决于你将如何访问你的数据,以及堆栈的哪一部分对你来说更重要。如果您要处理您的用户而不考虑他们的类型并将他们一起查询,那么将他们放在一起是有意义的。但是,如果要分别访问和处理每种类型,那么最好将每种具体类型都保留在它自己的 table.
中
我通常会考虑以下情况来解决此类问题:
数据库设计最重要,应用程序始终运行
一次针对一种用户类型
如果您想专注于数据库设计并制作一个规范化模式,并且您的应用程序更有可能一次只针对一种用户类型运行,在这种情况下,我会添加一个 user
table 这是一个“根”,它有一个 user_id
和一些其他常见的个人信息列。对于其他具体类型的用户,我会在 user
table user_id
列中添加一个带有外键的单独 table。
从数据库的角度来看,我可以接受不完美的设计,并且应用程序将同时对不同的用户类型进行操作
在这种情况下,添加一个 user
table,其中包含所有可能的类型特定列,这些列当然可以为空。除了 first_name
、'last_name' 等必需的通用列之外...您还需要一个列来告诉您用户类型。您可以创建一个单独的 table user_type
(1 - 战士,2 - 法官等...)并从 user
table 引用它,或者保持简单将字符串“FIGHTER”、“JUDGE”直接保存在 user
table 中,并在应用程序端使用某种 enum
类型对其进行处理。
我通常更喜欢第一个选项,因为它更符合逻辑,也更简洁,但如前所述,这取决于您的最终用例。
我有几种类型的用户:FIGHTER、JUDGE、SPECTATOR、PROMOTER,LOCATION_PROVIDER。 它们都有一些参数,有些是通用的,有些是特定的。我的理由是,为每种类型的用户设置一个单独的 tablea 是合乎逻辑的。每个这样的 table 只会存储与特定类型的用户数据相关的数据。
据我从此处提供的文档中可以看出:
https://github.com/typeorm/typeorm/blob/master/docs/entity-inheritance.md
TypeOrm 提出了一些暗示继承的解决方案,但它们都是关于减少代码量的。例如,名为 Single Table Inheritance 的模式允许在代码方面对实体进行一些分离,但是所有类型的用户都将被转储到单个 table],从模式的名称中可以看出这一点。其他解决方案对我来说并不好。
我正在考虑创建一个 table users
来存储通用数据,然后创建所有其他 table 来存储特定类型的数据。
例如,
user
有first_name
、second_name
、age
.
fighter
有weight
、wins
、losses
、draws
、
但问题是这些table恰好是不相关的。那么这是否意味着我必须编造一些使它们相关的逻辑?不确定我是否了解如何最好地处理它。
此类问题的最佳答案是:视情况而定。说真的,这取决于你将如何访问你的数据,以及堆栈的哪一部分对你来说更重要。如果您要处理您的用户而不考虑他们的类型并将他们一起查询,那么将他们放在一起是有意义的。但是,如果要分别访问和处理每种类型,那么最好将每种具体类型都保留在它自己的 table.
中我通常会考虑以下情况来解决此类问题:
数据库设计最重要,应用程序始终运行 一次针对一种用户类型
如果您想专注于数据库设计并制作一个规范化模式,并且您的应用程序更有可能一次只针对一种用户类型运行,在这种情况下,我会添加一个
user
table 这是一个“根”,它有一个user_id
和一些其他常见的个人信息列。对于其他具体类型的用户,我会在user
tableuser_id
列中添加一个带有外键的单独 table。从数据库的角度来看,我可以接受不完美的设计,并且应用程序将同时对不同的用户类型进行操作
在这种情况下,添加一个
user
table,其中包含所有可能的类型特定列,这些列当然可以为空。除了first_name
、'last_name' 等必需的通用列之外...您还需要一个列来告诉您用户类型。您可以创建一个单独的 tableuser_type
(1 - 战士,2 - 法官等...)并从user
table 引用它,或者保持简单将字符串“FIGHTER”、“JUDGE”直接保存在user
table 中,并在应用程序端使用某种enum
类型对其进行处理。
我通常更喜欢第一个选项,因为它更符合逻辑,也更简洁,但如前所述,这取决于您的最终用例。