Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 带详细信息的布尔属性(如果是)?_Mysql_Database_Database Design - Fatal编程技术网

Mysql 带详细信息的布尔属性(如果是)?

Mysql 带详细信息的布尔属性(如果是)?,mysql,database,database-design,Mysql,Database,Database Design,在我的表“Phones”中,有一个布尔列“memoryCard” 如果手机不允许使用外部存储卡,则memoryCard=False,否则为True 但是如果memoryCard=True,那么我必须在数据库中输入存储卡的类型 如何对此进行建模?我是否应该在“Phones”表中创建另一列“memoryCardType”?或者我必须创建一个包含卡片类型的单独表 非常感谢。首先,您应该有一张单独的存储卡桌。您的电话表应该有一个指向该表的外键引用,其中有一个名为MemoryCardId的列 接下来,你有

在我的表“Phones”中,有一个布尔列“memoryCard”

如果手机不允许使用外部存储卡,则memoryCard=False,否则为True

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

如何对此进行建模?我是否应该在“Phones”表中创建另一列“memoryCardType”?或者我必须创建一个包含卡片类型的单独表


非常感谢。

首先,您应该有一张单独的存储卡桌。您的电话表应该有一个指向该表的外键引用,其中有一个名为
MemoryCardId
的列

接下来,你有一个选择。您将有一个字段
MemoryCardId
,该字段可以是
NULL
。您可以将
NULL
值视为根本没有存储卡。如果是,您可以在手机上放置视图以获取布尔值:

create v_phones as
    select p.*, (MemoryCardId is not null) as HasMemoryCard
    from phones;
否则,您可以有一个单独的标志(正如您在问题中所建议的)。只有当标志值为true时,才使用
MemoryCardId
。在大多数数据库中,可以添加
检查
约束,以确保id和标志对齐。唉,在MySQL中,您需要使用触发器来实现这一点

编辑:

显式表优于
枚举

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

“您应该有一个单独的存储卡表”与
ENUM
列相比,这有什么优势?我唯一能想到的是,一个单独的表是最终用户可编辑的,但这在这种情况下可能不适用。@rubesmoker。请参阅我编辑的答案。列表太长,无法放入注释中。我更喜欢为存储卡类型创建一个单独的表,但我有一个问题:如果MemoryCardId=Null,那么我们有两种情况:1-手机不允许使用外部存储卡2-我们没有此信息(如果允许或不允许,我还没有)@ista9im。确切地在这种情况下,您需要一个单独的布尔值,而不是依赖于id。@Gordon Linoff。。。那么,如何制作呢?除了外键“MemoryCardId”之外,我是否还必须创建一个布尔列InformationExist(在表“Phones”中)?