如果为YES,则为布尔属性

时间:2014-12-03 23:40:40

标签: mysql database database-design

在我的“电话”表中,我有一个布尔列'memoryCard'。

如果手机不接​​受外部存储卡,那么memoryCard = False,否则为True。

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

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

非常感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

否则,你可以有一个单独的标志(正如你在问题中建议的那样)。当标志的值为true时,您只能使用MemoryCardId。在大多数数据库中,您可以添加check约束以确保id和标志对齐。唉,在MySQL中,你需要用触发器来做这件事。

编辑:

明确表格优于enum

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