-
24-10-2019 - |
题
我想这是一个半共同的问题,但我在过去的问题列表中找不到。我有一组需要共享主键索引的产品表。假设以下内容:
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_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
首先让我说我同意混乱,拉里和菲尔所说的一切。
但是,如果您坚持另一种方式...
您共享的PK有两个原因。两张表的独特性和两个以完成参考完整性。
我不确定哪个“序列”具有Auto_increment列支持。似乎有一个 系统设置 按值定义增量,但每列没有任何内容。
我在甲骨文中要做的只是在两个表之间共享相同的顺序。另一种技术是在自动插入中设置2个步骤值2,并以1的速度开始。无论哪种方式,您都在它们之间生成唯一的值。
您可以创建一个只有PK列的第三个表。如果没有办法在一台服务器中创建跳过自动数,则此列还可以提供自动化。然后,在每个数据表上,您会添加CRUD触发器。将任一数据表中的插入插入将首先启动插入到伪索引表中(并返回在本地表中使用的ID)。同样,从本地表中删除将启动从伪索引表删除。任何需要指向父母指向此伪索引表的孩子表。
请注意,这需要是每个行触发器,并且会放慢这些表上的CRUD。但是,“产品”之类的桌子首先往往没有很高的DML速率。任何抱怨“绩效影响”的人是 不是 考虑规模。
请注意,这是作为功能替代方案提供的,而不是我的建议 最好的 方法
您不能“共享”主键。
在不知道所有细节的情况下,我最好的建议是将桌子组合到单个产品表中。拥有一些用于某些产品而不是其他产品的可选字段并不一定是一个不好的设计。
另一个选项是具有一种继承模型,其中您有一个产品表,然后是两个产品“ Subtype”表,该表参考主产品表并具有自己的专业场集。查询此模型比单个表IMHO更痛苦,这就是为什么我将其视为不太理想的选择。
您的解释有点模糊,但是从我的基本理解来看,我会很想这样做
产品表包含通用字段
product
-------
product_id
name
...
product_extra1表和product_extra2表包含不同的字段这些表HABE在product.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的另一种情况。