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