【问题标题】:An entity/database design dilemma实体/数据库设计困境
【发布时间】:2021-05-19 12:44:08
【问题描述】:

这是一个与设计相关的问题,而不是与实际编程相关的问题。假设我在系统中有一个用户配置文件,并且此配置文件涉及基本信息和高级信息。假设它还将涉及对此数据的基本搜索和高级搜索。在这种情况下,最好使用一个大实体而不区分基本数据和高级数据,还是将这些信息拆分为两个实体,其中高级继承自基本数据?再次考虑将在所有这些数据上执行搜索。还要考虑“高级实体”可能涉及 Enum 或 Set 之类的字段。在这些情况下可以使用 SET 和 ENUM 字段,还是应该进一步拆分我的高级实体/表以进一步一对一关系?

这里是一个例子:

Profile (base entity)
+- Location (will probably poit to a location table)
 - Birthdate
 - Sex
 - Avatar
 - Pictures (will point to pictures entity)

Advanced profile (extends Profile)
+- eye_color (enum like)
 - hair_color (enum like)
 - weight
 - heigth
 - favorite_hobbies (set like)
 - favorite_quote
 - known_programming_languages (set like)

等等!这个例子很基础,但实际项目会涉及更多的数据。

您对设计这些东西的最佳方式有什么建议吗?

【问题讨论】:

  • II 建议不要使用 set datatype..
  • 答案取决于这些表的实际使用情况,很难给你一个明确的答案!
  • 只有对量化数据有概念的人才能做出合理的决定:会有多少用户,具有基本和高级属性的典型用户元组有多长,查询应该多快,该表将增长多少以及在什么时间等。我也建议不要使用集合数据类型。
  • 将配置文件表拆分为多个表的一个原因是第二个表中的列是可选的,如果配置文件是一个表,则大多数情况下为空。

标签: database-design relational-database


【解决方案1】:

对于以一对一方式与配置文件本身关联的所有数据,应将其存储在一个表中,其中键是配置文件的 ID。我们称之为 profile_header 表。在您的示例中,profile_header 表将包含:profile id、位置、生日、性别、头像、eye_color、hair_color、weight、height、favourite_quote。

您可以使用其他表扩展此模型,这些表可能有多个与配置文件头表相关的条目(一对多)。在您的示例中,我将创建这些表。

  • profile_pictures(个人资料 ID 和图片 ID 上的键)
  • profile_hobbies(个人资料 ID 和爱好 ID 上的键)
  • profile_programming_labguages(配置文件 ID 和编程语言 ID 的键)

在此设置中,您可以将大量图片、爱好和编程语言绑定到一个个人资料。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2018-09-05
    • 2015-05-08
    相关资源
    最近更新 更多