在设计表时,我养成了一个习惯,就是让一个列是唯一的,并且我制作了主键.这取决于要求以三种方式实现:
数字3将用于相当小的查找,主要是可能具有唯一静态长度字符串代码的读取表,或者诸如年份或其他数字的数字值.
在大多数情况下,所有其他表将具有自动递增整数或唯一标识符主键.
我最近开始使用没有一致行标识符的数据库,主键目前在各个列上进行聚类.一些例子:
这有一个有效的案例吗?我总是会为这些案例定义一个标识或唯一标识符列.
此外,还有许多表没有主键.这有什么正当理由?
我试图理解为什么桌子的设计原样,对我来说这似乎是一个很大的混乱,但也许有充分的理由.
第三个问题可以帮助我解释答案:在使用多列构成复合主键的情况下,这种方法与代理/人工密钥相比有特定的优势吗?我主要考虑的是性能,维护,管理等方面?
为什么我应该使用像CouchDB这样的基于文档的数据库而不是使用关系数据库.是否存在基于文档的数据库比关系数据库更适合的典型应用程序或域?
为什么数据库人员继续关于规范化?
它是什么?它有什么用?
它适用于数据库之外的任何内容吗?
任何善良的灵魂都可以通过下面的一个简单示例澄清我的疑惑,并确定超级钥匙,候选钥匙和主键?
我知道有很多帖子和网站在那里解释它们之间的差异.但看起来所有都是通用定义.
例:
Student (StudentNumber, FamilyName, Degree, Major, Grade, PhoneNumber)
Run Code Online (Sandbox Code Playgroud)
所以从上面的例子中,我可以知道StudentNumber
是一个主键.
但至于超级密钥,我有点困惑,哪些属性组合可以分组到超级密钥?
至于候选键,我对给定的定义感到困惑,因为任何候选键都可以作为主键.
这是否意味着诸如PhoneNumber
候选键之类的属性可以成为主键?(假设一个人PhoneNumber
只属于一个学生)
谢谢你的任何澄清!
重复
我对Google的Bigtable了解不多,但我想知道Google的Bigtable和MySQL之类的关系数据库之间的区别是什么.两者有什么限制?
在一个全新的程序中,空间并不是真的那么大,最好是删除行或禁用行,让我们说一个布尔"禁用"并让程序忽略它?
例如,如果我想从程序中删除用户.
许多数据库系统不允许对表和字段进行注释或描述,那么除了明显具有良好命名约定外,如何记录表/字段的用途?
(我们现在假设"优秀"表和字段名称不足以记录数据库中每个表,字段和关系的完整含义.)
我知道很多人使用UML图来可视化数据库,但我很少 - 如果有的话,看到包含字段注释的UML图.但是,我在使用.sql
文件内的注释方面有很好的经验.这种方法的缺点是,.sql
随着数据库结构随时间的变化,它需要手动保持文件的最新状态 - 但如果这样做,您也可以将其置于版本控制之下.
我见过的其他一些技术是描述数据库结构和关系的单独文档,以及在ORM代码或其他数据库映射代码中手动维护的注释.
你过去怎么解决这个问题?存在哪些方法以及与它们相关的各种利弊?您如何在"完美世界"中解决这个问题?
更新
正如其他人所指出的那样,大多数流行的SQL引擎实际上都允许注释,这很好.奇怪的是,人们似乎并没有太多使用这些功能.至少不是我过去参与过的项目.
在阅读了这篇伟大的Nettuts +文章的提示之后,我想出了一个表模式,它可以将高度易变的数据与其他表进行大量读取分离,同时降低整个数据库模式中所需的表数,但是我我不确定这是不是一个好主意,因为它不符合规范化的规则,我想听听你的意见,这里是一般性的想法:
我有四种类型的模拟用户的类表继承结构,在主"用户"表我常用的数据存储到所有用户(id
,username
,password
,数flags
,...)与一些一起TIMESTAMP
字段(date_created
,date_updated
,date_activated
,date_lastLogin
,. ..).
引用上面提到的Nettuts +文章中的#16提示:
示例2:表中有"last_login"字段.每次用户登录网站时它都会更新.但是表上的每次更新都会导致刷新该表的查询缓存.您可以将该字段放入另一个表中,以将用户表的更新保持在最低限度.
现在它变得更加棘手,我需要跟踪一些用户统计信息
在我完全规范化的数据库中,这增加了大约8到10个额外的表,这不是很多但是如果可以的话我想保持简单,所以我想出了以下" events
"表:
|------|----------------|----------------|---------------------|-----------|
| ID | TABLE | EVENT | DATE | IP |
|------|----------------|----------------|---------------------|-----------|
| 1 | user | login | 2010-04-19 00:30:00 | 127.0.0.1 |
|------|----------------|----------------|---------------------|-----------|
| 1 | …
Run Code Online (Sandbox Code Playgroud) 我有一个前缀trie.在关系数据库中表示此结构的推荐架构是什么?我需要子串匹配才能保持高效.
relational ×10
database ×5
sql ×4
mysql ×2
oracle ×2
bigtable ×1
couchdb ×1
partitioning ×1
primary-key ×1
ruby ×1
schema ×1
sql-server ×1
trie ×1
tuples ×1