Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.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/0/iphone/44.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
Database 使用带NOTNULL的伪行解决默认NULL_Database_Schema - Fatal编程技术网

Database 使用带NOTNULL的伪行解决默认NULL

Database 使用带NOTNULL的伪行解决默认NULL,database,schema,Database,Schema,我知道使用默认空值不是一个好的做法,但我有许多可选的查找值,它们在系统中是FK,所以要解决这个问题,我正在做的就是:我对每个FK/查找列使用NOTNULL。我在每个查找表中都有第一行,它是pkid=1,作为一个虚拟行,所有列中都没有。通过这种方式,我可以在模式中使用NOTNULL,如果需要,可以为没有任何查找值的FKs引用none行值PK=1 这是一个好的设计还是其他解决方案 编辑: 我有: 邻域表 邮政桌 每个社区都有一个城市,因此FK不能为空。 但并非每个邮政编码都属于一个社区。有些是这样,

我知道使用默认空值不是一个好的做法,但我有许多可选的查找值,它们在系统中是FK,所以要解决这个问题,我正在做的就是:我对每个FK/查找列使用NOTNULL。我在每个查找表中都有第一行,它是pkid=1,作为一个虚拟行,所有列中都没有。通过这种方式,我可以在模式中使用NOTNULL,如果需要,可以为没有任何查找值的FKs引用none行值PK=1

这是一个好的设计还是其他解决方案

编辑: 我有: 邻域表 邮政桌

每个社区都有一个城市,因此FK不能为空。 但并非每个邮政编码都属于一个社区。有些是这样,有些则不依赖于国家。因此,如果我在postal和Neighbor之间使用NOTNULL作为FK,那么我将被拧紧,因为必须输入一些值。所以我所做的实质是:在每个表中有一行作为虚拟行,只是为了链接FKs

这样,邻域表中的第一行将是: n_id=1 name=none 等等

在邮政表格中,我可以有: 邮政编码=3456A3 FK城市=莫斯科 FK邻域_id=1作为非空值

如果邻域查找表中没有虚拟行,则必须将FK邻域_id声明为默认的空列,并在表中存储空格。这是一个示例,但在许多表中,有大量的值将为空

这是一个好的设计还是其他解决方案


ISNULL或COALESCE和LEFT JOIN通常与选项列表中的任何其他选项一样,都不是一个选项。为它设置一个特殊的行可能是完全合理的;它简化了事情。如果您将其他信息链接到选项,例如人类可读的名称,这可能特别实用。

这似乎是数据库中过早优化的一个简单例子:

如果您的模式是这样的,那么我看不出有什么问题。有些邮政编码在附近,有些不在。对于可为null的列来说,这是一个很好的例子

关于避免空值的建议是避免不属于表中的信息。例如,如果您有另外五列,它们只与邻近的postalcodes相关,那么对于不在邻近的邮政编码,这些列将为空。这将是一个很好的理由,有第二个平行的表,用于邻近的postalcodes,它可以包含其他五列

更重要的是,如果性能是一个问题,那么解决方案就是从两个方面进行尝试,测试性能,看看哪个性能最好。这种性能考虑将与设计的简单性和可读性竞争,性能可能会获胜

举例说明这个问题。我从一个对象角色建模模型开始,与我用来生成早期ER图的模型相同。但是,我创建了PostalCode的一个子类型,并在该子类型中添加了另外两个必需角色:

这可以生成与第一个非常相似的ER模型:

但是这个模型没有显示,只要PostalCode是一个邻域PostalCode,就有强制的列。以下模型确实表明:


我想说的是,如果您有一组在某些情况下是必需的可选列,那么您应该创建一个子类型,该子类型始终使这些列不为NULL。但是,如果您只是有一些随机列,这些列可能随机不为空,那么请将它们作为空列保留在主表中。

您可以始终使用左连接来连接可能不存在的邮政编码

select * from from table_a 
  left join table_b    
  on table_a.postalcode_id = table_b.postalcode_id
无论postalcode\u id是否为空,都将选择行。当您使用幻数来指定空值时,查询的可读性就会降低

清楚:

select count(*) from table_a where postalcode_id is null;
不太清楚:

 select count(*) from table_a where postalcode_id = 1;

使用null可以使查询显式地处理null情况,但它也会自行记录处理null的意图。

不要告诉我们您是如何实现架构的,而应该告诉我们您试图实现什么。目标是在我的架构中不使用任何默认null。但当然,很多时候值是可选的,我不能将这些列设为非空。所以我正在找一份工作。上面的路是我唯一能想到的,想知道是否有更好的解决方法,或者是否可以将列保留为默认空值,这几乎是FKs的50%。您试图完成的=您的模式是关于什么的,或者您正在解决的更大的问题是什么。实际上,您只需重新指定空值一个新的更模糊的值,那么为什么这样做是好的呢?另外,为什么您觉得空值是一个问题?没有一个是一个例子。我可以将该行称为NULL、n/a或空。不,不是说UI。只有在数据库中。我在问题中添加了更多细节,并举例说明了我正在尝试的内容。是的,模式是正确的。表中还有更多的列,如邮政编码ha
s纬度、经度,也映射到国家表。所以本质上,你是说表中有空值是可以的,即使它是一列中值的一半?这取决于。总的来说,某些实体的值有时是未知的,这是完全合理的。当这些值中的某些子集有时是强制性的,而另一些则不是强制性的时,问题就来了。我来举个例子。