从数据库中使用哪些ID?

时间:2011-07-21 14:00:51

标签: sql database database-design

我有两个SQL表,A和B.每个表都有主键ID。表B有字段X(可以是NULL),它引用A的ID(如果它不为空)。

然后我需要一个存储在表A中的对象标识符的列表(存储在文件中)。

您建议使用哪些ID,列表中的A.ID或B.ID? (很明显,如果B中的行具有非NULL X,则在B中具有行的ID我们可以推断出A中行的ID。)

[ADDED]要清楚:对象部分存储在A中,部分存储在B中。

[ADDED]表的结构(z_users是B,z_clients是A,z_users.client是字段X):

CREATE TABLE `z_users` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `password` varchar(255) collate utf8_bin NOT NULL,
  `fullname` varchar(255) collate utf8_bin NOT NULL,
  `phone` varchar(255) collate utf8_bin NOT NULL,
  `address` text collate utf8_bin NOT NULL,
  `email` varchar(255) collate utf8_bin default NULL,
  `admin` enum('false','true') collate utf8_bin NOT NULL default 'false',
  `worker` int(10) unsigned default NULL,
  `client` int(10) unsigned default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `worker` (`worker`),
  UNIQUE KEY `client` (`client`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `z_clients` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `company` text collate utf8_bin NOT NULL,
  `shortdesc` text collate utf8_bin NOT NULL,
  `site` varchar(255) collate utf8_bin NOT NULL,
  `affair` varchar(255) collate utf8_bin NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

3 个答案:

答案 0 :(得分:1)

使用表格的业务键(自然键)。在数据库外部保留代理键通常是不明智的,因为它会创建隐藏的依赖关系 - 如果代理键被重构或其值发生更改,则数据库外的数据将变为无效或引用错误的值。

您的每个表似乎只有一个密钥,在这种情况下我不清楚业务密钥应该是什么。

答案 1 :(得分:0)

如果对象存储在表A中,则使用表A的ID是唯一合乎逻辑的事情。

回复您的修改:

我看不到你们桌子之间的联系。但如果它是一对一的关系,它可能应该在一个表中。 如果是一对多,则使用“one”表的主键。

答案 2 :(得分:0)

您使用对您正在解决的业务案例有意义的集合。

  1. 无论是否有B
  2. ,您都可以选择所有A.
  3. 如果有A
  4. ,您可以选择所有B
  5. 如果有相应的B
  6. ,您可以选择所有A.
  7. 只有在有相应的A
  8. 时才可以选择所有B.
  9. 您可以选择具有其他属性的额外条件
  10. 中的任何一个