共享主键

我猜这是一个半常见的问题,但我在过去的问题列表中找不到它。我有一组需要共享主键索引的产品表。假设如下:
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有类似的解决方案。我认为它不是基于回答。我想我必须继续使用表继承...谢谢大家。     
已邀请:
这不是很常见,不是。没有本机方式来共享主键。在你的情况下我可能做的是:
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
也就是说,有一个主产品表包含所有产品的条目,并且具有在类型之间进行概括的字段,以及具有外键的类型指定表到主产品表中,这些表具有特定于类型的数据。     
更好的设计是将公共列放在一个product表中,将特殊列放在两个单独的表中。在所有三个表中使用product_id作为主键,但在两个特殊表中,它还是一个返回主产品表的外键。 这简化了按类别对ID和名称的基本产品搜索。 另请注意,您的设计最多只允许每个产品属于一个类别。     
看来你正在寻找表继承。 你可以使用一个公共表
product
,它具有product1和product2共有的属性,加上一个
type
属性,可以是
"product2"
"product1"
然后表
product1
product2
将具有所有特定属性和对父表的引用
product
product:
    id,
    name,
    category,
    type

product1_table:
    id,
    #product_id,
    product1_specific_fields

product2_table:
    id,
    #product_id,
    product2_specific_fields
    
首先让我说我同意Chaos,Larry和Phil所说的一切。 但如果你坚持另一种方式...... 共享PK有两个原因。两个表中的一个唯一性和两个完整的参照完整性。 我不确定Auto_increment列支持什么“序列”功能。似乎有一个系统设置来按值定义增量,但每列没有任何内容。 我在Oracle中所做的只是在两个表之间共享相同的序列。另一种技术是在auto_increment中将STEP值设置为2,并从1开始,另一个在2开始。无论哪种方式,您都会在它们之间生成唯一值。 你可以创建一个只有PK列的第三个表。如果无法在一台服务器中创建跳过自动编号,则此列还可以提供自动编号。然后在每个数据表上添加CRUD触发器。插入任一数据表将首先启动插入伪索引表(并返回ID以在本地表中使用)。同样,从本地表中删除将从伪索引表中启动删除。需要指向父表的任何子表指向此伪索引表。 请注意,这将需要是每行触发器,并将减慢这些表上的crud。但是像“产品”这样的表往往不会有很高的DML率。任何抱怨“性能影响”的人都没有考虑规模。 请注意,这是一个有效的替代方案,而不是我推荐的最佳方式     
您无法“共享”主键。 在不知道所有细节的情况下,我最好的建议是将表合并到一个产品表中。拥有为某些产品而非其他产品填充的可选字段不一定是糟糕的设计。 另一种选择是拥有一种继承模型,其中您有一个产品表,然后是两个产品“子类型”表,它们引用主产品表并拥有自己的专用字段集。查询这个模型比单个表IMHO更痛苦,这就是为什么我认为它是不太理想的选择。     
你的解释有点模糊,但从我的基本理解,我很想做到这一点 产品表包含常用字段
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),这意味着每个产品可以与许多类别相关 现在可以保持不变了。     
这是gen-spec的另一个例子。 见前面的讨论     

要回复问题请先登录注册