【问题标题】:Good practice on saving properties in relational database在关系数据库中保存属性的良好做法
【发布时间】:2019-03-18 21:26:12
【问题描述】:

假设我的系统中有两种类型的用户。

会编程的人和不会编程的人。

我需要将两种类型的用户保存在同一个表中。 可以编程的用户与不能编程的用户有很多不同的属性,在另一个表中定义。

以下解决方案的优点是什么,有没有更好的解决方案?

解决方案 1

一个包含具有相应属性的列的表。

Table `users`:
----------------------------
| id | name  | can_program |
----------------------------
| 1  | Karl  | 1           |
| 2  | Ally  | 0           |
| 3  | Blake | 1           |
----------------------------

解决方案 2

两个表通过主键和外键相互关联。 一张表包含用户,另一张表只包含可以编程的人的 id。

users:

--------------
| id | name  | 
--------------
| 1  | Karl  |
| 2  | Ally  |
| 3  | Blake |
--------------

can_program:

---------------------
| id | can_program  | 
---------------------
| 1  | 1            |
| 3  | 1            |
---------------------

【问题讨论】:

    标签: mysql sql database logic


    【解决方案1】:

    用户与允许他编程的属性之间存在一对一的关系。我建议将此信息作为附加列存储在表users 中。创建一个额外的表基本上会导致一个额外的存储结构,与原始表具有 1-1 的关系。

    【讨论】:

      【解决方案2】:

      为什么不只是有某种programmer_profiles 表与users 表具有一对多关系?

      如果programmer_profiles中有关联记录,那么他们可以编程,否则假定他们不能。

      这更加灵活,因为您可以添加提供不同属性的其他 x_profiles 表,即使其中一些具有相同的名称。

      【讨论】:

      • 谢谢。我如何加入这些表以获得列“can_program”,如果是,则为 1,否则为 0?
      • 你不能那样加入他们。这是一对多的,因为programmer_profiles 有某种user_id 列链接回users 表。变成SELECT ... FROM users LEFT JOIN programmer_profiles ON users.id=programmer_profiles.user_id
      • 但假设我只需要处理那些可以编程的用户。我将如何编写查询以仅返回此类查询?或者我需要检查programmer_profiles 中的is_teacher 是否等于NULL1
      • 您可以使用RIGHT JOIN 仅选择具有匹配配置文件的记录。 LEFT JOIN 选择所有记录并包括配置文件(如果存在)。关系数据库都是关于关系数据的,这意味着JOIN 会大量参与。
      猜你喜欢
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多