有想到的是空值不应该在关系数据库中被允许的学校。 也就是说,一个表的属性(列)不应该允许空值。 从软件开发背景的人,我真的不明白这一点。 看来,如果空是属性的范围内有效,那么它应该被允许。 这是在Java中很常见,其中的对象引用往往无效。 由于没有一个庞大的数据库的经验,我不知道如果我在这里失去了一些东西。
Answer 1:
空值从负数据库标准化的角度来看。 这个想法是,如果一个值可以什么都没有,那么你真的应该拆分出来到另一个疏表,使得你不需要对那些没有价值的物品行。
这是确保所有的数据是有效的和有价值的努力。
在某些情况下,具有空场是有用的,但是,尤其是当你想避免另一个加盟出于性能的考虑(虽然这不应该是一个问题,如果数据库引擎的设置是否正确,除了非凡的高性能方案。)
-亚当
Answer 2:
对空值的一个说法是,他们没有一个明确的解释。 如果一个字段为空,也可以被解释为以下任何一项:
- 该值是“无”或“空集”
- 没有价值的是有道理的那场。
- 该值是未知的。
- 该值尚未进入。
- 该值是一个空字符串(用于不空值和空字符串之间区分数据库)。
- 一些应用程序特定的含义(例如,“如果该值为null,则使用默认值。”)
- 出现了一个错误,导致该领域有一个空值时,它实在不应该。
有些架构设计师要求所有值和数据类型应该有明确定义的解释,因此空值是坏的。
Answer 3:
空标记的罚款。 真的,他们是。
Answer 4:
这取决于。
只要你明白,为什么您允许NULL
S IN数据库( 需要在每列的基础所做的选择 ),你会如何解释,忽略或以其他方式处理他们,他们都很好。
举例来说,像一列NUM_CHILDREN
-什么,如果你不知道答案,你做的-它应该是NULL
。 在我心中,没有此列的设计,没有其他的最好的选择(即使你有一个标志,以确定是否NUM_CHILDREN
列是有效的,你还必须在此栏中输入值)。
在另一方面,如果你不允许NULL
S和对某些特殊的情况下保留值(而不是标志),像-1儿童的数量当它实际上是未知的,你必须以类似的方式来解决这些,在公约,文档等方面
因此,最终,这些问题都与公约,文档和一致性加以解决。
替代方案中,如显然由Adam戴维斯在上述回答拥护归一化列出稀疏(或不那么稀疏的,在的情况下的, NUM_CHILDREN
例或其中大部分数据具有已知值的任何实施例)的表,同时能够消除所有空值,是在一般的做法无法使用的。
在许多情况下,一个属性是未知的,这是毫无意义的加入到另一个表的每一个列可能允许NULL
S IN一个简单的设计。 的开销加入,为theprimary键的空间要求使得在现实世界中没有什么意义。
这使我想起这样重复的行可以通过添加基数柱被淘汰,而从理论上解决了不具有唯一关键的问题,在实践中有时是不可能的 - 例如,在大规模数据。 较真然后迅速提出一个替代品,而不是PK,但这个想法是毫无意义的替身可以形成一个关系(表)的元组(行)的一部分是从视关系理论的角度可笑。
Answer 5:
有几种不同的反对使用NULL的。 一些反对是基于数据库的理论。 从理论上讲,是理论与实践之间没有什么区别。 在实践中,有。
的确,一个完全规范化的数据库可以在不NULLS相处的。 其中数据值必须被排除在外的任何地点为一整行可以在不丢失信息被遗漏的地方。
在实践中,分解表到这个程度也是没有很大的用处,以及数据库变得更加繁琐,而且容易出错,而不是减少对执行简单的CRUD操作所需的编程。
有些地方使用空值可能会导致问题:基本上这些围绕着以下问题:是什么丢失的数据究竟意味着什么? 所有空真正传达的是,没有存储在一个给定的字段值。 但推论应用程序员从丢失的数据有时不正确绘制,这导致了很多问题。
数据可以从一个位置缺失的原因有多种。 这里有几个:
该数据是在这种情况下不适用。 例如配偶的名字对于一个人。
数据输入表单的用户留下了一个领域的空白,并且应用程序并不需要在该领域的条目。
该数据是从其它数据库或文件复制到数据库中,并有源丢失的数据。
有外键编码的可选关系。
空字符串存储在Oracle数据库中。
以下是有关时,为了避免NULLS一些指导原则:
如果在正常预期编程的过程中,查询作家们写了很多ISNULL,NV,COALESCE或类似的代码,以代替一个有效的价值,为NULL。 有时候,这是更好地使在店里的时间替代,提供真实存储什么是“现实”。
如果罪名很可能是因为关闭包含空行进行计数。 通常,这可以通过只选择计数(MyField的),而不是COUNT(*)被省略。
这是一个地方,你天哪最好习惯NULL,且相应的程序:当你开始使用外连接,比如LEFT JOIN和RIGHT JOIN。 外背后的整点加入有别于内连接是让行一些匹配的数据丢失时。 丢失的数据将作为空值。
我的底线:不理解它不排除理论。 但是学习的时候,从理论出发,以及如何遵循它。
Answer 6:
没有什么错误使用NULL的数据字段。 您可以设置键为空时要小心。 主键不应该为NULL。 外键可以为空,但你必须要小心,不要制造孤立记录。
如果事情是“不存在”,那么你应该使用NULL而不是一个空字符串或其他种类标志的。
Answer 7:
而不是写了NULL的所有问题,以及三态VS布尔逻辑,等等 - 我会提供这个精辟的建议:
不允许空列中的,直到你发现自己在增加一个魔法值表示缺少或不完整的数据。
既然你问这个问题,你应该在你如何处理NULL 非常小心。 还有很多不明显的陷阱,以它的。 如有疑问,请不要使用NULL。
Answer 8:
还有另一种替代使用“N / A”或“N / K”或空字符串 - 单独的表。
例如,如果我们可能会或可能不知道客户的电话号码:
CREATE TABLE Customer (ID int PRIMARY KEY, Name varchar(100) NOT NULL, Address varchar(200) NOT NULL);
CREATE TABLE CustomerPhone (ID int PRIMARY KEY, Phone varchar(20) NOT NULL, CONSTRAINT FK_CustomerPhone_Customer FOREIGN KEY (ID) REFERENCES Customer (ID));
如果我们不知道电话号码,我们只是不添加行到第二个表。
Answer 9:
我要说的是空值绝对应该使用。 有没有其他代表缺乏数据的正确方法。 例如,这将是错误的使用空字符串来表示丢失的地址线,否则将是错误的用0表示丢失的年龄数据项。 因为这两个空字符串和0是数据。 空就是代表这种情况下的最佳途径。
Answer 10:
不要小看你通过制造领域可为空创建的复杂性。 例如,下面的where子句看起来将匹配的所有行(位只能是1或0,是吗?)
where bitfield in (1,0)
但是,如果该位域是空的,它会错过一些。 或采取以下查询:
select * from mytable
where id not in (select id from excludetable)
现在,如果excludetable包含空和1,这相当于:
select * from mytable
where id <> NULL and id <> 1
但是,“ID <> NULL”为ID的任何值false,所以这将永远不会返回任何行。 这通过surpise捕捉即使是经验丰富的数据库开发人员。
由于大多数人都措手不及由NULL被抓,我会尽量避免它,当我可以。
Answer 11:
这是蠕虫的一个巨大的可以,因为NULL可能意味着很多东西:
- 有死的日期,因为这个人还活着。
- 没有手机号码,因为我们不知道它是什么,甚至如果它存在。
- 没有社会安全号码,因为那个人知道没有一个。
其中的一些可以由归一化是可以避免的,它们中的一些可以通过一个值的该列中(“N / A”)的存在下避免,它们中的一些可以由具有一个单独的列来解释NULL的存在可以减轻( “N / K”, “N / A” 等)。
这也是忌讳的,因为找到他们所需要的SQL语法是,非空值的不同,很难加入他们,和他们一般不包含在索引条目。
因为前者的原因,你会发现情况空是不可避免的。
因为后者的原因你还是应该尽最大努力减少它们的数量。
无论如何,总是用NOT NULL约束,以防止在需要值空。
Answer 12:
与空的主要问题是,他们有可以生产比较,聚集意想不到的效果,并加入特殊的语义。
没有什么是等于无效,并没有什么事情不等于,大于或小于零,所以你必须,如果你想要做任何大宗比较空值设置为一个占位符值。
这也是对可能的加入可以使用组合键的问题。 那里的自然键包括空列,你可能要考虑利用合成关键。
空白可退出计数,这可能不是你想要的语义。
在一列空值,你可以加入反对将消除来自内部行加入。 通常,这可能是期望的行为,但它可以奠定大象陷阱的人做报告。
有不少其他细微之处是空值。 乔·塞科的SQL for Smarties一有关于这个问题的整个章节,是一个很好的书,值得一读呢。 其中空值是一个很好的解决方案的地方是一些例子:
可选的关系,其中一个加盟实体可能会或可能不存在。 空就是代表一个外键列的可选关系的唯一途径。
你不妨列使用空退学计数。
可选的数值(例如货币)值,其可以或可以不存在。 目前在数字系统(特别是零是一个合法的值)“不录”没有有效的占位符值,所以空真的是这样做的唯一的好办法。
在那里你可能要避免使用空值,因为它们可能导致微妙的错误地方的一些例子。
“不记录”上与FK代码字段与参考表中的值。 使用占位符值,所以你(或一些随机的业务分析师走下赛场)做对数据库查询时不小心跌落行出来的结果集。
其中已经输入任何说明字段-空字符串(
''
)这个工作正常。 这节省了处理空值作为一种特殊情况。报告或数据仓库系统的可选列。 对于这种情况,做一个占位符排在维“不录”,加入对抗。 这简化了查询,并即席报表工具,很好地发挥。
再次,Celko的书是受到良好待遇。
Answer 13:
了解范式最好的事情是,他们是导游和导游不应固执地坚持。 当学术界的世界与现实世界相冲突,你很少看到acedemia许多幸存的战士。
在回答这个问题的是,其确定使用空值。 只是评估您的情况,并决定是否要他们在表中显示或数据崩溃到另一个相关的表,如果你觉得你到实际值空值的比例过高。
作为一个朋友喜欢说的“不要让完美成为优秀的敌人”。 想想伏尔泰也说。 8)
Answer 14:
根据严格的关系代数,不需要空值。 然而,对于任何实际的项目,他们是必要的。
首先,许多真实世界的数据是未知或不适用,空实现这些行为良好。 其次,他们做出的观点和外部连接更加实用。
Answer 15:
你会与你不能避免在数据库中的空值,因为问问题的顺序/数据采集很少的逻辑数据模型相匹配一步一步的数据采集系统发现。
或者你也可以默认值(需要的代码来处理这些默认值)。 你可以假设所有的字符串都是空的,而不是零,例如,在你的模型。
或者你可以有用于数据采集一直持续,直到填充实际的数据库表之前获得的所有数据临时数据库表。 这是一个很多额外的工作。
Answer 16:
到数据库,空翻译过来就是“我没有这个值”。 这意味着(有趣的),一个布尔列允许空值是完全可以接受的,并出现在许多数据库模式。 相反,如果你在你的代码中的布尔值,可以具有值“真”,“假”或“未定义”,你可能会看到你的代码拉闸上thedailywtf迟早:)
所以,是的,如果你需要允许不具有字段任何值,则允许在列空的可能性是完全可以接受的。 它比潜在替代品显著更好(空字符串,零等)
Answer 17:
空值是很难的工作,但他们却感觉在某些情况下。
假设你有一个具有日期值的列“PaidDate”发票表。 你把该列中是什么发票已支付(假设你不事先知道什么时候会支付)之前? 它不能是空字符串,因为这不是一个有效的日期。 它没有意义给它一个任意日期(例如1/1/1900),因为该日期根本是不正确的。 这似乎是唯一合理的值是NULL,因为它不具有价值。
在数据库与空工作有一些挑战,但数据库处理得很好。 当您加载从数据库空到你的应用程序代码的实际问题。 这就是我发现的东西都比较困难。 例如,在.NET中,在一个强类型数据集(模仿您的数据库结构)的日期是值类型,不能为空。 所以,你必须建立解决方法。
避免空的时候可以,但不排除他们,因为他们有合法的用途。
Answer 18:
我想你混淆了物理数据建模概念数据建模。
在CDM的对象是否可选字段,你应该亚型的对象,并为当字段不为空的新对象。 这是在存款机理论
在现实世界中,我们做出种种妥协于现实世界的。 在现实世界中NULL是罚款多,他们是必不可少的
Answer 19:
我同意上述许多问题的答案,也相信NULL可以使用,在适当情况下,在一个标准化的架构设计 - 尤其是当你可能希望避免使用某种“神奇数字”或默认值,进而可能是误导!
虽然最终,我认为需要空的使用要深思熟虑(而不是默认情况下),以避免一些上述问题的答案列出的assuptions的,特别是在NULL可能被认为是“无”或“空”,“未知'或‘值尚未进入尚未’。
Answer 20:
有一个问题,如果你使用的是Oracle数据库。 如果一个空字符串保存为CHAR类型列则Oracle要挟值为NULL不问。 因此,它可以是相当困难的,以避免在甲骨文字符串列NULL值。
如果您正在使用NULL值,学会使用SQL命令COALESCE,特别是字符串值。 然后,您可以防止NULL值propogating到您的编程语言。 例如,假设有姓,中间名和FamilyName一个人,而是要返回单场;
SELECT FullName = COALESCE(FirstName + ' ', '') + COALESCE(MiddleName+ ' ', '') + COALESCE(FamilyName, '') FROM Person
如果你不使用COALESCE,如果有一列包含NULL值,你会得到NULL返回。
Answer 21:
从技术上讲,空值是在该组织的关系数据库是基于关系的数学非法的。 所以,从纯技术,语义关系模型的角度来看,不,他们是不行的。
在现实世界中,非规范化和一些违规行为模型的都还行。 但是,在一般情况下,空值是一个指标,你应该看看你的整体设计更加紧密。
我总是十分警惕空的,并试图将它们归出来时,我可以。 但是,这并不意味着他们不是有时是最好的选择。 但我肯定会瘦的“不空”,除非你真的确定具有空值是在您的特定基础较好的一面。
Answer 22:
NULL岩石。 如果在某些情况下是没有必要的,SQL不会有IS NULL和IS NOT NULL作为特殊情况下的运营商。 NULL是概念普及的根,一切为NOT NULL。 使用NULL的自由,只要有可能的数据值是不存在,但没有错过。 默认值只能补偿NULL,如果他们是绝对正确的所有的时间。 举例来说,如果我有一个单比特场“的isReady”它可能是完美的意义这个领域有虚假和NULL的默认值不会被允许的,但这种暗示称,我们知道还没有准备好一切,当事实上,我们可能没有这样的知识。 机会是,在工作流程的情况下,谁的人决定准备 - 或 - 不只是一直没有进入他们的意见的机会呢,这样的假默认实际上可能是危险的,导致他们忽视似乎有一个决定已经取得,但实际上只有默认。
顺便说一句,并参照中等最初的例子,我的父亲没有中间名,因此,他的中间名是NULL - 不为空,空间,或星号 - 除在军队,他的中间名是NMI =无中间初始。 多么愚蠢的事?
Answer 23:
虽然在技术上空值是OK的字段值,它们经常皱眉。 根据数据如何被写入到数据库,这是可能的(普通)与该领域的一个空字符串值落得而不是一个NULL。 因此,具有此字段作为WHERE子句的一部分的任何查询,需要处理这两种情况下它们是不必要的按键。
Answer 24:
null表示没有价值的同时,0没有,如果你看到一个0你不知道的意思,如果你看到一个空的,你知道这是一个缺失值
我认为空处非常明显,0和“”令人困惑,因为他们没有清楚地表明存储的值的意图
Answer 25:
不采取我的话挖苦,我是认真的。 除非你是用玩具数据库NULL的工作是不可避免的,在现实世界,我们无法避免NULL值。
只是说你怎么能有名字,中间的名字,每个人的姓氏。 (中间名和姓是可选的,那么在这种情况下,空值在那里为你),你怎么能有传真,办公电话,办公电话为大家在博客列表中。
NULLS都很好,你必须妥善处理时检索。 在SQL Server 2008中有稀疏列在这里你能避免采取NULL值也是空间的概念。
不要混淆零和任何其他值空值。 人做任何说这是正确的。
由于纳文
Answer 26:
我今天的有争议的观点 - 让数据库列为NULL的默认可能是在所有的RDBMS土地最坏的普遍接受的设计决策。 每一个供应商这样做,而且它是错的。 空值是在特定的,具体的,深思熟虑的情况很好,但你要明确禁止空值的每一行的想法使疏忽空性的方式更为普遍比它应该是。
Answer 27:
就个人而言,我认为,当你正在使用的字段作为外键到另一个表,以象征这个记录不链接到任何东西在其他表零点,才应使用。 除此之外,我发现空值的编程应用程序逻辑时实际上是非常麻烦的。 因为在大多数编程语言数据库空了很多的数据类型没有直接的表示,它最终创造了大量的应用程序代码来处理这些空值的含义。 当DB遇到空整数,并且尝试,例如,1的值添加到它(又名空+ 1),该数据库将返回null,因为这是逻辑是如何定义的。 然而,当一种编程语言,尝试添加空,1,它通常会抛出异常。 所以,你的代码最终与日期字段,如果值是零,这往往只是相当于转换为0数字,文本空字符串做什么检查,有的空日期(1900/1/1?)散落。
Answer 28:
我认为这个问题归结为您解读一下NULL值来表示。 是的,有一个NULL值很多解释,但其中一些张贴在这里的不应该被使用。 NULL的真正含义是由应用程序的情况下确定的,绝不应该是指超过一两件事。 例如,一个建议是,在野外出生的日期NULL会显示该人还活着。 这是危险的。
在所有简单,定义为NULL,并坚持下去。 我用它来表示“在这个字段中的值是未知在这个时候。” 这意味着,和仅此而已。 如果你需要它的意思是别的东西为好,那么你需要重新审视你的数据模型。
Answer 29:
这是一个与空精绝。
Answer 30:
这一切都归结到正常化与易用性和性能问题。
如果你要坚持完成你会写出来的东西,看起来像规范化规则:
选择c.id,c.lastname,从.......客户C留在c.id = cpn.customerid左加入customeraddress CA上c.id = ca.customerid左加入customerphonenumber2 CPN2基于C加入customerphonenumber CPN。 ID = cpn2.customerid等,等,等