4

我猜这是一个半常见的问题,但我在过去的问题列表中找不到它。我有一组需要共享主键索引的产品表。假设如下:

product1_table:
    id,
    name,
    category,
    ...other fields

product2_table:
    id,
    name,
    category,
    ...other fields

product_to_category_table:
    product_id,
    category_id

显然,在两个产品表之间有一个共享索引会很有用。请注意,将它们分开的想法是因为它们在基础之外具有很大不同的字段集,但是它们共享一个共同的分类。

更新:

很多人建议使用表继承(或 gen-spec)。这是我知道的一个选项,但在其他数据库系统中,我可以在表之间共享一个序列,我希望 MySQL 有一个类似的解决方案。我将假设它不基于响应。我想我将不得不使用表继承......谢谢大家。

4

7 回答 7

9

这并不常见,不。没有本地方法可以共享主键。在你的情况下我可能会做的是:

product_table
    id
    name
    category
    general_fields...

product_type1_table:
    id
    product_id
    product_type1_fields...

product_type2_table:
    id
    product_id
    product_type2_fields...

product_to_category_table:
    product_id
    category_id

也就是说,有一个主产品表,其中包含所有产品的条目并具有在类型之间进行概括的字段,以及具有外键的类型指定表到主产品表中,其中具有类型特定的数据。

于 2011-01-25T17:08:18.670 回答
5

更好的设计是将常用列放在一个产品表中,将特殊列放在两个单独的表中。在所有三个表中都使用 product_id 作为主键,但在两个特殊表中,它是返回主产品表的外键。

这简化了按类别搜索 id 和名称的基本产品搜索。

请注意,您的设计最多允许每个产品属于一个类别。

于 2011-01-25T17:11:36.290 回答
1

首先让我声明,我同意 Chaos、Larry 和 Phil 所说的一切。

但如果你坚持另一种方式...

你们共享PK有两个原因。两个表之间的一个唯一性和两个完整的参照完整性。

我不确定 Auto_increment 列支持哪些“序列”功能。似乎有一个系统设置可以按值定义增量,但每列都没有。

我在 Oracle 中所做的只是在两个表之间共享相同的序列。另一种技术是在 auto_increment 中将 STEP 值设置为 2,并从 1 开始,另一个从 2 开始。无论哪种方式,您都会在它们之间生成唯一值。

您可以创建第三个表,其中只有 PK 列。如果无法在一台服务器中创建跳过自动编号,此列还可以提供自动编号。然后在每个数据表上添加 CRUD 触发器。对任一数据表的插入将首先启动对伪索引表的插入(并返回 ID 以在本地表中使用)。同样,从本地表中删除将启动从伪索引表中的删除。任何需要指向父表的子表都指向这个伪索引表。

请注意,这将需要是每行触发器,并且会减慢这些表上的 crud。但是像“产品”这样的表一开始往往不会有很高的 DML 率。任何抱怨“性能影响”的人都没有考虑规模。

请注意,这是作为一种有效的替代方案提供的,而不是我的建议作为最佳方式

于 2011-01-25T17:41:48.730 回答
1

看来您正在寻找表继承。

您可以使用具有productproduct1 和 product2 共有的属性的公用表,以及type可以是"product2""product1"

然后表product1product2将具有其所有特定属性和对表的引用product

product:
    id,
    name,
    category,
    type

product1_table:
    id,
    #product_id,
    product1_specific_fields

product2_table:
    id,
    #product_id,
    product2_specific_fields
于 2011-01-25T17:12:11.167 回答
0

这是 gen-spec 的又一个例子。

见之前的讨论

于 2011-01-25T17:58:47.153 回答
0

您不能“共享”主键。

在不了解所有细节的情况下,我最好的建议是将这些表组合成一个产品表。为某些产品而非其他产品填充可选字段并不一定是一个糟糕的设计。

另一种选择是拥有一种继承模型,其中您有一个产品表,然后是两个产品“子类型”表,它们引用主产品表并具有自己的专用字段集。查询这个模型比单表恕我直言更痛苦,这就是为什么我认为它是不太理想的选项。

于 2011-01-25T17:11:11.143 回答
0

你的解释有点含糊,但根据我的基本理解,我很想这样做

产品表包含常用字段

product
-------
product_id
name
...

product_extra1 表和 product_extra2 表包含不同字段使用唯一约束是唯一的。您将需要决定如何填充这些数据的业务规则

product_extra1
---------------
product_id
extra_field1
extra_field2
....

product_extra2
---------------
product_id
different_extra_field1
different_extra_field2
....

根据您在 product_category 表上方的内容,这是一个相交表(1 对多 - 多对 1),这意味着每个产品都可以与许多类别相关,现在可以保持不变。

于 2011-01-25T17:16:43.703 回答