我继承了一个数据库,其构思是复合键比使用唯一的对象ID字段更理想,并且在构建数据库时,永远不应将单个唯一ID 用作主键.因为我正在为这个数据库构建一个Rails前端,所以我遇到了使它符合Rails约定的困难(虽然可以使用自定义视图和一些额外的gem来处理复合键).
编写它的人的这种特定模式设计背后的原因与数据库如何以非有效方式处理ID字段有关,并且当它构建索引时,树类排序存在缺陷.这个解释没有任何深度,我仍然试图围绕这个概念(我熟悉使用复合键,但不是100%的时间).
任何人都可以提供意见或为此主题添加更深入的内容吗?
我的mysql表中有一个主键,它由三列组成.
CREATE TABLE IF NOT EXISTS `bb_bulletin` (
`OfficeCode` int(5) NOT NULL,
`IssuerId` int(11) NOT NULL,
`BulletinDtm` datetime NOT NULL,
`CategoryCode` varchar(4) NOT NULL,
`Title` varchar(255) NOT NULL,
`Content` text NOT NULL,
PRIMARY KEY (`OfficeCode`,`IssuerId`,`BulletinDtm`),
UNIQUE KEY `U_IssuerId` (`IssuerId`,`OfficeCode`,`BulletinDtm`),
UNIQUE KEY `U_CategoryCode` (`CategoryCode`,`OfficeCode`,`IssuerId`,`BulletinDtm`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)
是否有一种速记方法来为主键的给定值选择记录.
我试过了.
SELECT * FROM `bb_bulletin` WHERE PRIMARY = '20001-1-2011-01-07 14:04:40'
Run Code Online (Sandbox Code Playgroud)
而不是长手的做法,
SELECT * From bb_bulletin WHERE OfficeCode = 20001 AND IssuerId = 1 AND BulletinDtm = 2011-01-07 14:04:40
Run Code Online (Sandbox Code Playgroud)
在表中处理php和复合键时的标准是什么.注意:我不想在表中添加自动增量键来解决这个问题.如果不可能,那么我将在我的网址中传递三个约束.
这是我的表:
CREATE TABLE group_edits (
vfile_id bigint(20) unsigned NOT NULL,
editor_id int(10) unsigned NOT NULL,
edits text
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
没有唯一索引,因为一个editor_id可以编辑多个vfile_id,也可以通过多个editor_id编辑一个vfile_id.
phpMyAdmin 4.1.6不允许我编辑这个表说:
Current selection does not contain a unique column. Grid edit, checkbox, Edit, Copy and Delete features are not available.
Run Code Online (Sandbox Code Playgroud)
现在它让我觉得这样的桌子有什么问题吗?当您获取editor_id和vfile_id的值时,行是唯一的,而单独的列都不是唯一的.
我知道要修复它我可以添加
`ID` int(11) NOT NULL AUTO_INCREMENT,
Run Code Online (Sandbox Code Playgroud)
但它并不反映我的数据库架构的设计,我想避免添加技巧只是为了使phpMyAdmin工作.
我的数据库设计是错误的还是phpMyAdmin?
设计数据库是否有一般的经验法则允许列作为空值与3nf规范化?我有一个列,其中列主要由空值(85%)组成,但表大小不超过10K记录(不是很大).它主要用于记录和记录保存,因此大多数事务将是插入和选择,没有更新.我正在尝试考虑性能和简化设计.在这种情况下,非规范化还是规范化会有很大的好处吗?不同的RDBMS表现不同吗?