这个例子来自w3schools.
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)
Run Code Online (Sandbox Code Playgroud)
我的理解是两个列在一起(P_Id
和LastName
)代表表的主键Persons
.它是否正确?
ddl database-design primary-key relational-database database-table
我试图找出决定是否添加自动递增整数作为表的主键的"最佳实践".
假设我有一个包含化学元素数据的表格.每个元素的原子序数是唯一的,永远不会改变.因此,不是为每列使用自动递增整数,而是使用原子序数可能更有意义,对吗?
如果我有一张书桌,那也是如此吗?我应该使用ISBN还是主键的自动递增整数?或者包含每个人的SSN的员工表?
可能重复:
您如何看待主键?
我知道使用GUID的好处,以及在数据库中使用和INT作为PK的好处.考虑到GUID本质上是128位INT而普通INT是32位,INT是节省空间(尽管在大多数现代系统中这一点通常没有实际意义).
最后,在什么情况下你会发现自己使用INT作为PK而不是GUID?
在我在教育期间(大约4年前)做过的数据库课程中,我认为建议避免使用字符串作为主键的数据类型.
有人能告诉我在SQL中为主键选择字符变化数据类型的优缺点是什么,以及上述前提是多少?
注意:(我正在使用PostgreSQL数据库).我还在处理一种情况,当你需要从另一个表引用这样一个表时,从而将外键放在字符变化的数据类型上.请同时考虑一下.
sql primary-key foreign-key-relationship sqldatatypes postgresql-9.1
我们正在努力为我们正在创建的资产系统提出一个编号系统,在办公室里对这个主题进行了一些激烈的讨论,所以我决定向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,因为如果我们决定更改资产编号的生成方式,则不必对主键进行级联更新.
您认为我们应该怎么做?
谢谢.
编辑:谢谢大家的好评,给了我很多帮助.
我有什么理由不使用Integer作为我的表的主键吗?
数据库是SQL-CE,每年大约50,000个条目的两个主表,以及一些次要表.只有两个连接将一直存在于数据库中.但是更新将通过多个TCP套接字连接触发,因此将有许多交叉线程访问并使用相同的数据库连接.虽然活动非常低,但是同样的更新是不太可能的,但可能每天最多可能发生几次.
可能会将LINQ2SQL用于DAL或类型化数据集.
不确定这些信息是否相关,但这就是我要问的原因,因为我不知道:)
我必须为一个非常大的网站提供会员解决方案.该站点将使用ASP.NET MVC 2和MS SQL2008数据库构建.
目前的会员提供商看起来似乎有点过分,功能太多了.
我要存储的只是电子邮件/密码和基本个人资料信息,例如First/LastName,电话号码.我只需要2个角色,管理员和用户.
考虑到可能有数百万用户注册,您对此类情景有何建议?StackOverflow使用什么?
我过去经常使用现有的会员API,并将其扩展到存储其他信息等.但是有表格如
aspnet_Applications
aspnet_Paths
aspnet_SchemaVersions
aspnet_WebEvent_Events
aspnet_PersonalizationAllUsers
aspnet_PersonalizationPerUser
Run Code Online (Sandbox Code Playgroud)
这是非常多余的,我从来没有找到用途.
编辑
只是为了澄清@drachenstern回答之后的一些其他冗余,还有一些额外的列,我在Membership/Users表中没有用,但会添加到每个select/insert语句的有效负载中.
此外,我听说GUID并不是那么快,而且更愿意使用整数(就像Facebook那样),这也是公开曝光的.
我如何创建自己的成员资格提供程序,重新使用一些成员资格API (验证,密码加密,登录cookie等),但只能使用符合我要求的表格?
我们非常欢迎链接到文章和现有实施,我的谷歌搜索返回了一些非常基本的例子.
在此先感谢
Marko
如果主键是单列(例如,为每行生成的GUID)或多列(例如,外键GUID +偏移号),则表(在插入/更新和查询方面)性能是否存在任何差异? )?
我会假设查询速度应该更快,如果有任何多列主键,但我会想象插入会更慢,因为一个稍微复杂的独特检查?我还想象多列主键的数据类型也很重要(例如,如果其中一列是DateTime类型,则会增加复杂性).这些只是我想要调用答案和讨论(希望!)并且不是基于事实的.
我有三种基本类型的实体:人员,企业和资产.每个资产可以由一个且仅一个人或企业拥有.每个人和企业可以拥有0到多个资产.在Microsoft SQL Server中存储此类条件关系的最佳做法是什么?
我最初的计划是在Assets表中有两个可以为空的外键,一个用于People,一个用于Business.其中一个值将为null,而另一个将指向所有者.我在这种设置中看到的问题是它需要应用程序逻辑才能被解释和执行.这真的是最好的解决方案还是有其他选择?
primary-key ×6
database ×5
sql ×4
sql-server ×3
asp.net-mvc ×1
c# ×1
ddl ×1
guid ×1
login ×1
performance ×1
sqldatatypes ×1