共享主键

时间:2011-01-25 17:02:34

标签: mysql database-design tags shared-primary-key

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

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有类似的解决方案。我认为它不是基于回答。我想我必须继续使用表继承...谢谢大家。

7 个答案:

答案 0 :(得分:8)

这并不常见,不是。没有本机方式来共享主键。在你的情况下我可能做的是:

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

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

看来你正在寻找表继承。

您可以使用包含product1和product2共有属性的公用表product,以及可以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

答案 3 :(得分:1)

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

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

您的共享PK有两个原因。两个表中的一个唯一性和两个完整的参照完整性。

我不确定Auto_increment列支持的确切“序列”功能。似乎有system setting来按值定义增量,但每列没有任何内容。

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

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

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

请注意,这是一个有效的替代方案,而不是我推荐的最佳方式

答案 4 :(得分:0)

您无法“共享”主键。

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

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

答案 5 :(得分:0)

你的解释有点模糊,但从我的基本理解,我很想做到这一点

产品表包含公共字段

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

product_extra1表和product_extra2表包含不同的字段 这些表是product.product_id和。之间强制执行的一对一关系 product_extra1.product_id等。通过使用唯一约束将外键表(product_extra1等)中的product_id设置为唯一来实现一对一关系。 您需要决定如何填充此数据的业务规则

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

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

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

答案 6 :(得分:0)

这是gen-spec的另一个案例。

See previous discussion