我们再来一次,旧的论点仍然出现......
我们是否更好地将业务密钥作为主键,或者我们是否更愿意在业务键字段上具有唯一约束的代理ID(即SQL Server标识)?
请提供支持您的理论的示例或证明.
在我的团队的一个相当生气勃勃的讨论中,我被认为是大多数人喜欢的主键.我们有以下小组 -
什么是PK的最佳方法?如果你可以证明你的意见,这将是很棒的.上面有没有更好的方法?
编辑:任何人都有一个简单的样本/算法来生成可扩展的行的人类可读标识符?
algorithm ddl database-design primary-key relational-database
我们正在努力为我们正在创建的资产系统提出一个编号系统,在办公室里对这个主题进行了一些激烈的讨论,所以我决定向SO的专家们询问.
考虑到下面的数据库设计,什么是更好的选择.

示例1:使用自动代理键.
================= ==================
Road_Number(PK) Segment_Number(PK)
================= ==================
1 1
Run Code Online (Sandbox Code Playgroud)
例2:使用程序生成的PK
================= ==================
Road_Number(PK) Segment_Number(PK)
================= ==================
"RD00000001WCK" "00000001.1"
Run Code Online (Sandbox Code Playgroud)
(该00000001.1指它的第一个道路段,这增加了每次你添加一个新的细分如00000001.2)
示例3:使用两者(添加新列)
======================= ==========================
ID(PK) Road_Number(UK) ID(PK) Segment_Number(UK)
======================= ==========================
1 "RD00000001WCK" 1 "00000001.1"
Run Code Online (Sandbox Code Playgroud)
只是一些背景信息,我们将使用Road Number和Segment Number报告和其他文档,因此它们必须是唯一的.
我总是喜欢保持简单,所以我更喜欢示例1,但我一直在阅读,你不应该在报告/文档中公开你的主键.所以现在我更多地考虑示例3.
我也倾向于示例3,因为如果我们决定更改资产编号的生成方式,则不必对主键进行级联更新.
您认为我们应该怎么做?
谢谢.
编辑:谢谢大家的好评,给了我很多帮助.
基本上,我需要将来自多个供应商的产品数据组合到一个数据库中(当然,它比这更复杂),它有几个表需要连接在一起用于大多数OLTP操作.
我将坚持使用默认值并使用自动递增整数作为主键,但是当一个供应商提供他们自己的"ProductiD"字段时,其余的则没有,我将不得不做很多手动映射到另一个表然后加载数据(因为我必须首先将其加载到Products表中,然后将ID拉出并将其与我需要的其他信息一起添加到其他表中).
或者,我可以使用产品的SKU作为主键,因为SKU对于单个产品是唯一的,并且所有供应商都在其数据源中提供SKU.如果我使用SKU作为PK,那么我可以轻松加载数据源,因为所有内容都基于SKU,这就是它在现实世界中的工作方式.但是,SKU是字母数字的,并且可能比基于整数的密钥效率稍低.
我应该关注哪些想法?
(在那之前,我为我糟糕的英语道歉)我有这样的研究案例:
我目前在使用Web应用程序时出现问题.我为某个公司制作了一个Web应用程序.我使用CodeIgniter 3制作了应用程序.
我使用Maria DB构建了数据库.对于每个表中的id,我使用每个表的应用程序数据库的自动增量ID.我通常将Web应用程序部署到云服务器(有时公司有自己的专用服务器,但有时却没有).有一天,有一家公司,他们不想将我之前制作的应用程序部署到云端(出于安全目的,他们说).
该公司希望将该应用程序部署到员工的个人电脑上,而每个员工的电脑不相互连接(即独立的个人电脑/个人电脑/员工的笔记本电脑).他们说,他们会每5个月将员工个人电脑的所有数据收集到公司的数据中心,当然数据中心也没有连接到互联网.我告诉他们这不是存储数据的好方法.(因为当我尝试将所有数据合并为一个数据时,数据将重复,因为我的每个表的列ID都是自动增量ID,并且它是主键).不幸的是,该公司仍然希望以这种方式保留应用程序,我不知道如何解决这个问题.
他们至少有10名员工会使用这个网络应用程序.据此,我必须亲自将应用程序部署到10台PC上.
附加信息:每个员工都有自己从公司获得的唯一ID,我为每个员工创建了auto_increment id,如下表所示:
id | employee_id | employee_name |
1 | 156901010 | emp1
2 | 156901039 | emp2
3 | 156901019 | emp3
4 | 156901015 | emp4
5 | 156901009 | emp5
6 | 156901038 | emp6
Run Code Online (Sandbox Code Playgroud)
问题是每当他们从该应用程序填充表单时,某些表不存储员工的id,而是存储来自增量id的新id.
例如electronic_parts表格.它们具有如下属性:
| id | electronic_part_name | kind_of_electronic_part_id |
Run Code Online (Sandbox Code Playgroud)
如果emp1从Web应用程序填写表单,表格的内容将在下面.
| id | electronic_part_name | kind_of_electronic_part_id |
| 1 | switch | 1 …Run Code Online (Sandbox Code Playgroud) 通常,最好使用本机主键(即现有列或列组合)或将主键设置为自动生成的整数行?
编辑:
有人向我指出,这与这个问题非常相似.
这里的共识是使用代理键,这是我的天生倾向,但我的老板告诉我,我应该尽可能使用自然键.他的建议对于这个特定的应用程序可能是最好的,因为行中的Name唯一地标识它并且我们需要保持查看旧数据的能力,因此对名称/规则的任何更改将意味着新的唯一行.
虽然这里的答案都很有帮助,但大多数都是基于主观的"这就是你应该做的",而不是引用支持来源.我是否缺少一些必要的阅读材料,或者数据库设计是否具有高度主观性和/或依赖于应用程序?
我正在考虑设计一个私人消息系统,我需要一些输入,基本上我有几个问题.我已经阅读了大部分相关问题,他们已经给了我一些思考.
到目前为止,我所研究的所有基本消息系统都使用单个表来表示所有用户的消息.有了索引等,这种方法似乎很好.
我想知道的是将用户消息拆分成单独的表是否有任何好处.因此,当创建新用户时,将创建一个新表(在相同或专用的消息数据库中),该表存储为该用户发送和接收的所有消息.
以这种方式接近事物有哪些陷阱/好处?我用PHP编写代码需要编写的代码比第一个大表选项特别麻烦吗?与大型工作台相比,大量小型工作台的最终结果是否会更加强大,无故障?在大量并发用户的情况下,服务器的性能与处理一个大表和多个小表的比较如何?
任何有关这些问题或其他意见的帮助将不胜感激.在重写PM模块之前,我正在为我的测试站点进行较小规模的设计,并希望对其进行优化.我可怜的人类大脑更容易处理单独的桌子,但对于计算机而言,这一点并不一定如此.
database ×6
primary-key ×5
algorithm ×1
codeigniter ×1
ddl ×1
duplicates ×1
key ×1
mariadb ×1
mysql ×1