我有两个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;
答案 0 :(得分:1)
使用表格的业务键(自然键)。在数据库外部保留代理键通常是不明智的,因为它会创建隐藏的依赖关系 - 如果代理键被重构或其值发生更改,则数据库外的数据将变为无效或引用错误的值。
您的每个表似乎只有一个密钥,在这种情况下我不清楚业务密钥应该是什么。
答案 1 :(得分:0)
如果对象存储在表A中,则使用表A的ID是唯一合乎逻辑的事情。
回复您的修改:
我看不到你们桌子之间的联系。但如果它是一对一的关系,它可能应该在一个表中。 如果是一对多,则使用“one”表的主键。
答案 2 :(得分:0)
您使用对您正在解决的业务案例有意义的集合。