相关疑难解决方法(0)

代理与自然/商业密钥

我们再来一次,旧的论点仍然出现......

我们是否更好地将业务密钥作为主键,或者我们是否更愿意在业务键字段上具有唯一约束的代理ID(即SQL Server标识)?

请提供支持您的理论的示例或证明.

database database-design key primary-key

166
推荐指数
13
解决办法
6万
查看次数

你觉得你的主键怎么样?

在我的团队的一个相当生气勃勃的讨论中,我被认为是大多数人喜欢的主键.我们有以下小组 -

  1. Int/BigInt哪个自动增量是足够好的主键.
  2. 应该至少有3列构成主键.
  3. Id,GUID和人类可读行标识符都应该区别对待.

什么是PK的最佳方法?如果你可以证明你的意见,这将是很棒的.上面有没有更好的方法?

编辑:任何人都有一个简单的样本/算法来生成可扩展的行的人类可读标识符?

algorithm ddl database-design primary-key relational-database

85
推荐指数
11
解决办法
2万
查看次数

选择最好的主键+编号系统

我们正在努力为我们正在创建的资产系统提出一个编号系统,在办公室里对这个主题进行了一些激烈的讨论,所以我决定向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 NumberSegment Number报告和其他文档,因此它们必须是唯一的.

我总是喜欢保持简单,所以我更喜欢示例1,但我一直在阅读,你不应该在报告/文档中公开你的主键.所以现在我更多地考虑示例3.

我也倾向于示例3,因为如果我们决定更改资产编号的生成方式,则不必对主键进行级联更新.

您认为我们应该怎么做?

谢谢.

编辑:谢谢大家的好评,给了我很多帮助.

database database-design primary-key

23
推荐指数
3
解决办法
9605
查看次数

决定一个人工主键和Products表的自然键

基本上,我需要将来自多个供应商的产品数据组合到一个数据库中(当然,它比这更复杂),它有几个表需要连接在一起用于大多数OLTP操作.

我将坚持使用默认值并使用自动递增整数作为主键,但是当一个供应商提供他们自己的"ProductiD"字段时,其余的则没有,我将不得不做很多手动映射到另一个表然后加载数据(因为我必须首先将其加载到Products表中,然后将ID拉出并将其与我需要的其他信息一起添加到其他表中).

或者,我可以使用产品的SKU作为主键,因为SKU对于单个产品是唯一的,并且所有供应商都在其数据源中提供SKU.如果我使用SKU作为PK,那么我可以轻松加载数据源,因为所有内容都基于SKU,这就是它在现实世界中的工作方式.但是,SKU是字母数字的,并且可能比基于整数的密钥效率稍低.

我应该关注哪些想法?

database primary-key

21
推荐指数
2
解决办法
1万
查看次数

如何防止MariaDB中导入的表中的重复ID?

(在那之前,我为我糟糕的英语道歉)我有这样的研究案例:

我目前在使用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)

database codeigniter duplicates auto-increment mariadb

7
推荐指数
1
解决办法
369
查看次数

本机主键还是自动生成的?

通常,最好使用本机主键(即现有列或列组合)或将主键设置为自动生成的整数行?

编辑:
有人向我指出,这与这个问题非常相似.

这里的共识是使用代理键,这是我的天生倾向,但我的老板告诉我,我应该尽可能使用自然键.他的建议对于这个特定的应用程序可能是最好的,因为行中的Name唯一地标识它并且我们需要保持查看旧数据的能力,因此对名称/规则的任何更改将意味着新的唯一行.

虽然这里的答案都很有帮助,但大多数都是基于主观的"这就是你应该做的",而不是引用支持来源.我是否缺少一些必要的阅读材料,或者数据库设计是否具有高度主观性和/或依赖于应用程序?

database database-design primary-key

5
推荐指数
2
解决办法
3603
查看次数

私人消息系统,大型单表与许多小表

我正在考虑设计一个私人消息系统,我需要一些输入,基本上我有几个问题.我已经阅读了大部分相关问题,他们已经给了我一些思考.

到目前为止,我所研究的所有基本消息系统都使用单个表来表示所有用户的消息.有了索引等,这种方法似乎很好.

我想知道的是将用户消息拆分成单独的表是否有任何好处.因此,当创建新用户时,将创建一个新表(在相同或专用的消息数据库中),该表存储为该用户发送和接收的所有消息.

以这种方式接近事物有哪些陷阱/好处?我用PHP编写代码需要编写的代码比第一个大表选项特别麻烦吗?与大型工作台相比,大量小型工作台的最终结果是否会更加强大,无故障?在大量并发用户的情况下,服务器的性能与处理一个大表和多个小表的比较如何?

任何有关这些问题或其他意见的帮助将不胜感激.在重写PM模块之前,我正在为我的测试站点进行较小规模的设计,并希望对其进行优化.我可怜的人类大脑更容易处理单独的桌子,但对于计算机而言,这一点并不一定如此.

mysql database database-design

5
推荐指数
1
解决办法
1885
查看次数