mysql - 如果是,则带有详细信息的 bool 属性?

标签 mysql database database-design

在我的表“Phones”中,我有一个 bool 列“memoryCard”。

如果手机不支持外接存储卡,则memoryCard = False,否则为True。

但是如果 memoryCard = True,那么我必须将存储卡的类型放入数据库中。

如何建模?我应该在“Phones”表中创建另一列“memoryCardType”吗?或者我必须创建一个包含卡内存类型的单独表?

非常感谢。

最佳答案

首先,您应该有一个单独的存储卡表。您的手机表应该有一个对此表的外键引用,其中有一列名为 MemoryCardId

接下来,你有一个选择。您将有一个可以为NULLMemoryCardId 字段。您可以将 NULL 值视为根本没有存储卡。如果是这样,您可以在手机上放置一个 View 来获取 bool 值:

create v_phones as
    select p.*, (MemoryCardId is not null) as HasMemoryCard
    from phones;

否则,您可以有一个单独的标志(正如您在问题中所建议的那样)。仅当标志值为 true 时,您才会使用 MemoryCardId。在大多数数据库中,您可以添加 check 约束以确保 id 和 flag 对齐。唉,在 MySQL 中,您需要使用触发器来完成此操作。

编辑:

显式表相对于枚举的优势:

  • 您不会受到枚举中值数量的任意限制(请参阅 here )。
  • 如果存储卡名称实际上是数字,解析就不会混淆。
  • 如果您愿意,您可以存储有关存储卡的其他信息 - 制造商、发行日期、包装颜色。
  • 该解决方案更易于移植到其他数据库。

关于mysql - 如果是,则带有详细信息的 bool 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27283763/

相关文章:

php - php 中的 mysql 查询错误地评估为 true

mysql - 将 @jointable 与所有非唯一列一起使用

mysql - MariaDB(或MySQL)是否需要SSL证书以确保安全

python - 如何维护 Django 文档修订系统中的段落顺序?

sql-server - SQL Server - 对客户端数据的强大保护( Multi-Tenancy )

mysql - 将数据库中的所有 TinyInt(1) 列更改为非空默认值 0

mysql - #1241 插入到选择中的操作数应包含 1 列

database - 使用 mongodb 的聊天应用程序架构

sql-server - SSMA 时间戳。它有什么用,如何使用?

sql - 将字段存储为单一文本类型 JSON 字符串与拆分到单独表的性能影响