﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-橄榄的专栏-最新评论</title><link>http://www.cnblogs.com/petitlen/CommentsRSS.aspx</link><description /><language>zh-cn</language><pubDate>Fri, 29 Jan 2010 10:35:51 GMT</pubDate><lastBuildDate>Fri, 29 Jan 2010 10:35:51 GMT</lastBuildDate><generator>cnblogs</generator><item><title>Re:主键的选择，应该是业务有意义还是业务无意义，应该是逻辑主键还是业务主键</title><link>http://www.cnblogs.com/petitlen/archive/2010/01/25/1654753.html#1753437</link><dc:creator>方子</dc:creator><author>方子</author><pubDate>Mon, 25 Jan 2010 00:39:05 GMT</pubDate><guid>http://www.cnblogs.com/petitlen/archive/2010/01/25/1654753.html#1753437</guid><description><![CDATA[@橄榄细语
明细表的外键一定是用主表的主键来连接.
明细表的主键不使用复合主键,使用自增来做主键,但明细表要做索引.
<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/petitlen/" target="_blank">方子</a> 2010-01-25 08:39 <a href="http://www.cnblogs.com/petitlen/archive/2010/01/25/1654753.html#1753437#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Re:主键的选择，应该是业务有意义还是业务无意义，应该是逻辑主键还是业务主键</title><link>http://www.cnblogs.com/petitlen/archive/2010/01/25/1654753.html#1753428</link><dc:creator>Kevin Zou</dc:creator><author>Kevin Zou</author><pubDate>Mon, 25 Jan 2010 00:28:05 GMT</pubDate><guid>http://www.cnblogs.com/petitlen/archive/2010/01/25/1654753.html#1753428</guid><description><![CDATA[看情況而定，不過一般能用ID，就不用邏輯主鍵，否則擁抱變化很多時候就會成為空話了<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/petitlen/" target="_blank">Kevin Zou</a> 2010-01-25 08:28 <a href="http://www.cnblogs.com/petitlen/archive/2010/01/25/1654753.html#1753428#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Re:主键的选择，应该是业务有意义还是业务无意义，应该是逻辑主键还是业务主键</title><link>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753330</link><dc:creator>Ivony...</dc:creator><author>Ivony...</author><pubDate>Sun, 24 Jan 2010 14:38:07 GMT</pubDate><guid>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753330</guid><description><![CDATA[学离散数学对理解关系数据库是很有帮助的，只是用离散数学描述的时候，很容易让看官头晕。都是关系，数据表是关系，数据表之间的关系是关系之间的函数，函数也是关系的一种。关系是集合的笛卡尔积的子集，所以关系也是集合。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/petitlen/" target="_blank">Ivony...</a> 2010-01-24 22:38 <a href="http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753330#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Re:主键的选择，应该是业务有意义还是业务无意义，应该是逻辑主键还是业务主键</title><link>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753324</link><dc:creator>Ivony...</dc:creator><author>Ivony...</author><pubDate>Sun, 24 Jan 2010 14:24:07 GMT</pubDate><guid>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753324</guid><description><![CDATA[[quote]EricZhang(T2噬菌体)：
[quote]橄榄细语：
[quote]EricZhang(T2噬菌体)：关于关系数据库中很多设计原则和观点，直观理解可能比较混乱，建议你看一个抽象数学中的集合论和关系理论，尤其是关于笛卡尔积以及集合关系论相关内容，对你理解这些会有帮助。[/quote]

我不是学应数的，所以没看过抽象数学，也许你说的是抽象代数，不过离散数学的知识我还是没有丢的。
逻辑主键还是业务主键，均属于集合论的东东，请问拔高到数学层面，对这个问题有何帮助？[/quote]
从数学上来说，每一个字段都有一个值域，也即是一个集合，如果将表Tn中的字段的值域设为Tn1,Tn2,...,Tn...[/quote]


我不认同这个说法，两点

1、任何业务字段都不具备稳定性和不可重现性，这个结论的隐含前提是任何业务都是不稳定的，这是武断的。

2、主键是表（关系，即N个集合的笛卡尔积子集）自身的特性，与外键无关。主键的定义并不由外键导出，而事实上任何候选键（甚至是任何键）都可以作为外键属性的选择对象，这没有问题。主键只是最常用的，首选的候选键。

关系，即N个集合的笛卡尔积子集，也即数据库中的数据表，以下混用这几者。

最后，外键应该描述为两个关系（即数据表）之间的一个函数（关系即集合，所以关系之间可以存在关系以及函数）。这个函数的定义域是包含外键的表，值域是外键所指向的表。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/petitlen/" target="_blank">Ivony...</a> 2010-01-24 22:24 <a href="http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753324#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Re:主键的选择，应该是业务有意义还是业务无意义，应该是逻辑主键还是业务主键</title><link>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753269</link><dc:creator>破人</dc:creator><author>破人</author><pubDate>Sun, 24 Jan 2010 12:11:33 GMT</pubDate><guid>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753269</guid><description><![CDATA[我一般是需要通过这个主键进行查询的时候一般用业务主键
比如用户表,大多数人喜欢用自动编号作为主键,但更喜欢用注册的编号,比如呢称一样的字段做为主键,这样在查询比如定单的时候,可以直接通过呢称来查,因为自动编号没人记得住,当然,很多程序员是先通过注册编号来查自动编号,然后用自动编号来查数据,如果查询结果中需要显示注册编号,就用关联查询,但关联查询效率是十分低的.

很多人建立非业务主键是为了防止数据级联更新,这可能是多余的,更多的可能是考虑查询,既然是主键,本身更新的机率就比较少,而查询的机率非常大.

大数据量的表建议业务与逻辑整合.比如QQ号,比如taobao的订单号<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/petitlen/" target="_blank">破人</a> 2010-01-24 20:11 <a href="http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753269#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Re:主键的选择，应该是业务有意义还是业务无意义，应该是逻辑主键还是业务主键</title><link>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753259</link><dc:creator>EricZhang(T2噬菌体)</dc:creator><author>EricZhang(T2噬菌体)</author><pubDate>Sun, 24 Jan 2010 11:37:31 GMT</pubDate><guid>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753259</guid><description><![CDATA[[quote]橄榄细语：
[quote]EricZhang(T2噬菌体)：关于关系数据库中很多设计原则和观点，直观理解可能比较混乱，建议你看一个抽象数学中的集合论和关系理论，尤其是关于笛卡尔积以及集合关系论相关内容，对你理解这些会有帮助。[/quote]

我不是学应数的，所以没看过抽象数学，也许你说的是抽象代数，不过离散数学的知识我还是没有丢的。
逻辑主键还是业务主键，均属于集合论的东东，请问拔高到数学层面，对这个问题有何帮助？[/quote]
从数学上来说，每一个字段都有一个值域，也即是一个集合，如果将表Tn中的字段的值域设为Tn1,Tn2,...,Tnm，则Tn中的每条记录都是一个{Tn1,Tn2,...,Tnm}的笛卡尔积，所以数据表的实质就是一系列笛卡尔积的集合，而一个库的实质就是一系列笛卡尔积的集合的集合。而外键关联的实质是两个笛卡尔积集合（即表）中的一个子集和一个元素存在偏序关系，外键完整性表示偏序集的可寻溯性，这就要求其中的偏序前元素（即主键）具有稳定性和不可重现性，而任何业务字段都不具备这两项，所以业务字段作为主键会存在使得集合之间的偏序关系的可寻溯性遭到破坏的风险，因此，更提倡使用无意义字段作为主键。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/petitlen/" target="_blank">EricZhang(T2噬菌体)</a> 2010-01-24 19:37 <a href="http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753259#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Re:主键的选择，应该是业务有意义还是业务无意义，应该是逻辑主键还是业务主键</title><link>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753153</link><dc:creator>卡通一下</dc:creator><author>卡通一下</author><pubDate>Sun, 24 Jan 2010 05:20:15 GMT</pubDate><guid>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753153</guid><description><![CDATA[[quote]Ivony...：
一般的关系数据库管理工具，或者其他数据结构设计工具，允许你用可视化操作建立外键关系。当你用这种工具的时候，它会让你指定两个表，比如说从一个表拉动一条线段到另一个表，如果你有主键索引，它就可以智能的识别这个字段一般情况下当作主键来用，从而自动的给你弄好，如果没有主键索引，它就会说找不到主键。因为它搞不清哪个该当作主键来用。[/quote]
用鼠标拉线来建立关联，好久没有这么做了。

其实写个脚本来建立关联是很简单的事，也就是一行代码。
<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/petitlen/" target="_blank">卡通一下</a> 2010-01-24 13:20 <a href="http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753153#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Re:主键的选择，应该是业务有意义还是业务无意义，应该是逻辑主键还是业务主键</title><link>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753151</link><dc:creator>海岸线</dc:creator><author>海岸线</author><pubDate>Sun, 24 Jan 2010 05:17:44 GMT</pubDate><guid>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753151</guid><description><![CDATA[我强调主键不应该具有实际的意义，这可能对于一些朋友来说不太认同，比如
订单表吧，会有“订单编号”字段，而这个字段呢在业务实际中本身就是应该具有
唯一性，具有唯一标识记录的功能，但我是不推荐采用订单编号字段作为主键的，
因为具有实际意义的字段，具有“意义更改”的可能性，比如订单编号在刚开始的
时候我们一切顺利，后来客户说“订单可以作废，并重新生成订单，而且订单号要
保持原订单号一致”，这样原来的主键就面临危险了。因此，具有唯一性的实际字
段也代表可以作为主键。因此，我推荐是新设一个字段专门用为主键，此主键本身
在业务逻辑上不体现，不具有实际意义。而这种主键在一定程序增加了复杂度，所
以要视实际系统的规模大小而定，对于小项目，以后扩展不会很大的话，也查允许
用实际唯一的字段作主键的。 <br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/petitlen/" target="_blank">海岸线</a> 2010-01-24 13:17 <a href="http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753151#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Re:主键的选择，应该是业务有意义还是业务无意义，应该是逻辑主键还是业务主键</title><link>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753148</link><dc:creator>Ivony...</dc:creator><author>Ivony...</author><pubDate>Sun, 24 Jan 2010 05:13:09 GMT</pubDate><guid>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753148</guid><description><![CDATA[[quote]卡通一下：
@Ivony...

洋洋洒洒地写了这么多，呵呵！

首先我觉得好象唯一索引是可以做为关联表的“一”方，你所说的找不到主键，不太明白？

你后面举的例子好象都是建立在上面这个论点上的。

一般的网站的用户名是不能重复的，但不一定非得用主键，用唯一索引也是可以的。再定义一个主键来关联其它的业务，不是一样吗？

另外，这样做也避免了用户名的变更时，要“级联”其它的表。

我们在博客园的名称就是可以变更的，不是吗？

[/quote]


一般的关系数据库管理工具，或者其他数据结构设计工具，允许你用可视化操作建立外键关系。当你用这种工具的时候，它会让你指定两个表，比如说从一个表拉动一条线段到另一个表，如果你有主键索引，它就可以智能的识别这个字段一般情况下当作主键来用，从而自动的给你弄好，如果没有主键索引，它就会说找不到主键。因为它搞不清哪个该当作主键来用。

当然你也可以手动指定，这里说明的就是主键索引=唯一索引+不许为空+声明自己是首选的键。<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/petitlen/" target="_blank">Ivony...</a> 2010-01-24 13:13 <a href="http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753148#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Re:主键的选择，应该是业务有意义还是业务无意义，应该是逻辑主键还是业务主键</title><link>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753147</link><dc:creator>卡通一下</dc:creator><author>卡通一下</author><pubDate>Sun, 24 Jan 2010 05:09:01 GMT</pubDate><guid>http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753147</guid><description><![CDATA[@Ivony...

洋洋洒洒地写了这么多，呵呵！

首先我觉得好象唯一索引是可以做为关联表的“一”方，你所说的找不到主键，不太明白？

你后面举的例子好象都是建立在上面这个论点上的。

一般的网站的用户名是不能重复的，但不一定非得用主键，用唯一索引也是可以的。再定义一个主键来关联其它的业务，不是一样吗？

另外，这样做也避免了用户名的变更时，要“级联”其它的表。

我们在博客园的名称就是可以变更的，不是吗？

<br><br><div align=right><a style="text-decoration:none;" href="http://www.cnblogs.com/petitlen/" target="_blank">卡通一下</a> 2010-01-24 13:09 <a href="http://www.cnblogs.com/petitlen/archive/2010/01/24/1654753.html#1753147#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>
