嗨,我知道之前已经问过这个问题,但我找不到解决问题的有效方法。我有一个表有10列接受INT,指的是10个其他表。我的问题是,现在我需要只有一列,两个整数都指向同一个表。这怎么可能?我想有另一个表来保存每列一行并且第一个表每行有10行,这样我可以将它与第一个表的ID相关联,但现在又出现了一个新问题。我可以&# 39;知道哪一行引用哪个表,因为它以这种方式变为动态的。这有什么解决方案吗?
编辑:只想创建10个新表,所有表都链接到第一个表,而第一个表又引用所有内容。这真的是唯一的方法吗?这将留下21个表,但它会工作。这对性能有好处吗?
答案 0 :(得分:3)
听起来你正在努力将一对多关系变成多对多的关系。
您目前在主表A
的一行中有一个整数引用的每个表。
现在,您希望将一个或多个这些表引用为与主表中给定行关联的多个整数。这是多对多关系。它需要另一个表来表示这种关系。这个额外的表称为associative entity。
这是表K的样子:
抱歉,没有多对多关系的快捷方式。你需要中间表。然后,您可以在AK
中有多行引用A
中的给定行和K
中的多行。
如果所有关系都是多对多关系,那么每个关系需要一个额外的表。
其他评论指出,您的设计可能不需要这么多引用表。这可能是真的,因为您还没有提供有关这些表的详细信息。
然而,每个多对多关系都需要关系数据库中的关联实体。
另请阅读我对How to model a database with many m:n relations on a table的回答。
在评论中,很明显您正在尝试解决关系数据库中的常见问题,即描述许多不同产品类别的属性。它总是有点尴尬。
我在这里写了一个答案:How to design a product table for many kinds of product where each product has many parameters
我在这里做了一个关于数据建模的演示文稿:Practical Object Oriented Models In Sql
我在书中写了一篇关于这个问题的章节:SQL Antipatterns: Avoiding the Pitfalls of Database Programming。
您可能还想查看MySQL中的JSON数据类型,这种类型弥补了关系和NoSQL之间的差距。
答案 1 :(得分:1)
“我要求只有一列,两个整数都指向同一个表” - 这是糟糕的数据库设计。为什么没有两列在表1中引用表2的A列和B列,或者另外制作一个独立的表3,并添加喜欢表1和表2的外键约束。
答案 2 :(得分:1)
根据我的评论和与比尔的讨论,我决定冒更多时间浪费的风险,继续提供一些思考的食物。
您的原始问题缺乏详细信息,但您确实提供了一些信息。显然这是某种传统的产品/购物车/订单系统。您还说由于某种原因,您为每个类别制作了单独的产品表,这是引导您解决这个复杂问题的原因。
通过数据库设计,魔鬼就在细节之中。虽然这花了我大约一分钟的时间来创造,但它肯定是一个接近标准和适当的东西的起点。
可能有一些我们不理解的事情需要对此进行更改或添加,但如果没有明确表达您的要求,思考过程等,则无法将它们合并。考虑一下,这是一个稻草人,但至少有一个经验丰富的数据库架构师想出来。
现在我确信有一些重要的事情与产品和类别有关,而这些问题没有解决,但这将是一个单独的,可能更有价值的讨论的主题。
当然,像这样的系统会爆炸成一个包含更多表的模式,但这取决于具体的细节。