【问题标题】:Which IDs from a database to use?要使用数据库中的哪些 ID?
【发布时间】:2011-10-10 06:35:10
【问题描述】:

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

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

您建议使用哪些 ID,列表中的 A.ID 还是 B.ID? (很明显,有了 B 中一行的 ID,我们可以推断 A 中的一行 ID,前提是 B 中的该行具有非 NULL X。)

[添加] 明确一点:一个对象部分存储在 A 中,部分存储在 B 中。

[添加] 表结构(z_users 为 B,z_clients 为 A,z_users.client 为字段 X):

创建表`z_users`( `id` int(10) unsigned NOT NULL auto_increment, `password` varchar(255) 整理 utf8_bin NOT NULL, `fullname` varchar(255) 整理 utf8_bin NOT NULL, `phone` varchar(255) 整理 utf8_bin NOT NULL, `address` 文本整理 utf8_bin NOT NULL, `email` varchar(255) 整理 utf8_bin 默认 NULL, `admin` enum('false','true') collat​​e utf8_bin NOT NULL default 'false', `worker` int(10) 无符号默认 NULL, `client` int(10) 无符号默认 NULL, 主键(`id`), 唯一键`worker`(`worker`), 唯一键`client`(`client`), 唯一键 `email` (`email`) ) 引擎=InnoDB 默认字符集=utf8 排序=utf8_bin; 创建表`z_clients`( `id` int(10) unsigned NOT NULL auto_increment, `company` 文本整理 utf8_bin NOT NULL, `shortdesc` 文本整理 utf8_bin NOT NULL, `site` varchar(255) 整理 utf8_bin NOT NULL, `affair` varchar(255) 整理 utf8_bin NOT NULL, 主键(`id`) ) 引擎=MyISAM 默认字符集=utf8 排序=utf8_bin;

【问题讨论】:

    标签: sql database database-design


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      响应您的编辑:

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

      【讨论】:

      • 那你只能使用“一个”表的键,因为另一个可能不存在?
      • 如果不存在,他就不能在 ID 列表中(我存储在文件中)
      【解决方案3】:

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

      1. 无论是否有 B,您都可以选择所有 A
      2. 无论是否有 A,您都可以选择所有 B
      3. 只有当有对应的 B 时,才可以选择所有 A
      4. 只有当有对应的 A 时,才可以选择所有 B
      5. 您可以选择其中任何一个与其他属性的额外条件

      【讨论】:

      • 我添加是为了明确:一个对象部分存储在A中,部分存储在B中。
      • 请发布您的表格结构。
      • @cularis:根据您的要求,我将表格的结构添加到问题中
      猜你喜欢
      • 2011-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 2022-08-24
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多