这个问题是关于我应该如何设计一个数据库,它可以是关系型/ nosql数据库,这取决于什么是更好的解决方案
根据要求,您需要创建一个系统,该系统将包含一个跟踪“公司”和“用户”的数据库。一个用户总是只属于一个公司
- 用户只能属于一个公司
- 一个公司可以有很多用户
“公司”表的设计非常简单。公司将具有以下属性/列:(让我们保持简单)
ID, COMPANY_NAME, CREATED_ON
第一种情况
简单明了,用户都具有相同的属性,因此可以通过关系样式,用户表轻松完成此操作:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CREATED_ON
第二种情况
如果不同的公司想要为其用户存储不同的配置文件属性,会发生什么情况。每个公司将具有一组定义的属性,这些属性将应用于该公司的所有用户。
例如:
- 公司A要存储:LIKE_MOVIE(布尔值),LIKE_MUSIC(布尔值)
- 公司B要存储:FAV_CUISINE(字符串)
- 公司C要存储:OWN_DOG(布尔值),DOG_COUNT(整数)
方法1
暴力方式是为用户提供一个单一的架构,并在不属于公司的情况下让其为空:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, LIKE_MOVIE, LIKE_MUSIC, FAV_CUISINE, OWN_DOG, DOG_COUNT, CREATED_ON
这有点麻烦,因为您最终会得到很多NULL,并且用户行的列与它们不相关(即,属于公司A的所有用户的FAV_CUISINE,OWN_DOG,DOG_COUNT的值为NULL)
方法2
第二种方法是拥有“自由格式字段”:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_1, CUSTOM_2, CUSTOM_3, CREATED_ON
由于您不知道什么是自定义字段,因此这本身就很麻烦,数据类型将无法反映所存储的值(例如,我们将int值存储为VARCHAR)。
方法3
我已经研究了PostgreSQL JSON字段,在这种情况下,您将拥有:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_PROFILE_JSON, CREATED_ON
在这种情况下,如何将不同的模式应用于用户?公司A的用户的架构如下所示
{"LIKE_MOVIE":"boolean", "LIKE_MUSIC": "boolean"}
虽然拥有C公司的用户将具有不同的架构:
{"OWN_DOG ":"boolean", "DOG_COUNT": "int"}
我应该如何解决这个问题?如何根据他们(公司)之间的关系正确设计数据库,以便为单个“对象”(用户)提供这种灵活的架构?
关系解决方案?nosql解决方案?
编辑:我也考虑过一个“ CUSTOM_PROFILE”表,该表实际上将用户属性存储在行而不是列中。
这种方法有两个问题:
1)每位用户的数据随着行而不是列的增长而增长-这意味着要获得用户的全貌,需要完成许多联接,并且需要对不同的自定义属性进行多次联接到“自定义配置文件”表
2)即使我们知道数据应该是整数或布尔值,也总是将数据值存储为VARCHAR以便泛型