Mysql SQL:查找与给定记录相关的记录的最快查询是什么
我有这个桌子结构Mysql SQL:查找与给定记录相关的记录的最快查询是什么,mysql,sql,Mysql,Sql,我有这个桌子结构 Table A ------- id , name 1 , A1 2 , A2 3 , A3 4 , A4 5 , A5 6 , A6 Table B ------- id , name , tableA_id 1 , B1 , 1 2 , B2 , 2 .... Table C ------- id , name , tableA_id 1 , C1 , 3 2 , C2 , 4 .... Table D ------- id , n
Table A
-------
id , name
1 , A1
2 , A2
3 , A3
4 , A4
5 , A5
6 , A6
Table B
-------
id , name , tableA_id
1 , B1 , 1
2 , B2 , 2
....
Table C
-------
id , name , tableA_id
1 , C1 , 3
2 , C2 , 4
....
Table D
-------
id , name , tableA_id
1 , C1 , 5
2 , C2 , 6
....
问题
- 如果给我一个表id:3,最快的方法是什么 B、C、D表中的相关行
- 我会经常做这个,可以吗
- 如何确保表A中的每条记录在B、C、D中只有一条记录
- 我能做些什么来改进结构,以便使用更快的查询实现我想要的功能?我在考虑两种解决方案,但我不确定这是否是一种好的做法
Table A
-------
id , name , B_id, C_id, D_id
1 , A1 , 1 , ,
2 , A2 , 2 , ,
3 , A3 , , 1 ,
4 , A4 , , 2 ,
5 , A5 , , , 1
6 , A6 , , , 2
解决方案2:
Table A
-------
id , name , table, id
1 , A1 , B , 1
2 , A2 , B , 2
3 , A3 , C , 1
4 , A4 , C , 2
5 , A5 , D , 1
6 , A6 , D , 2
但我对这两种解决方案都不满意,因为我认为我无法应用限制/将其映射为适当的外键如果表a中的一条记录与表B、C或D中的一条或多条记录相关,那么您的设计是好的。但是,您可能会将B、C和D表合并为一个表,并只添加一个表来区分它,例如CategoryType。假设我们将合并表命名为M。结构可能如下所示
ID, Name, CategoryType, tableA_id
使用示例数据:
ID Name CategoryType tableA_id
1 C1 C 1
2 B1 B 2
3 A1 A 3
但是,如果表a中的一条记录与表B、C或D中的一条且仅一条记录相关,则该记录应位于一个表中
另一方面,使用当前的DB结构,您可以使用UNION ALL
合并结果,并使用LIMIT 1
确保只显示一个匹配项,如:
SELECT a.id, b.name as OneName
FROM tableA A
INNER JOIN tableB B
ON a.id = b.tableA_id
UNION ALL
SELECT a.id, b.name as OneName
FROM tableA A
INNER JOIN tableC C
ON a.id = c.tableA_id
UNION ALL
SELECT a.id, b.name as OneName
FROM tableA A
INNER JOIN tableC D
ON a.id = d.tableA_id
LIMIT 1
我会使用不同的选项,特别是如果您将来要销售三种以上的商品类别。
粗略地说,您需要4个表(在任何语言/本地化表之前): (是的,虽然我非常讨厌EAV的设置,但它就是为这种情况而设计的) 为什么会这样?一般来说,每次添加新的产品类型时都添加一个新表并不好。事实上,您希望在
产品
本身中放置尽可能多的属性-这需要一个平衡动作-尝试找出一些常见的查询属性,并将它们放在该表中,即使不是每个类别都有属性(显然,这需要可为空的列)。此外,一些
Product
列可能会在此处显示“双重职责”(…某种程度上…);汽车显然有颜色,家具也有颜色——一种是油漆,另一种是污渍。其他所有内容都进入
产品属性
。请注意使用属性
有助于减少属性拼写错误和重复条目(这应该是您的产品条目团队负责的,而不是客户)。尽管如此,您可能会惊讶于一个好的标题/描述索引和搜索功能所能产生的效果。您使用表B、C、D的目的是什么?让我知道plz,,我认为没有必要,一个表就足够了,因为您在所有三个表中都存储相同的数据tables@uvais每件事都有目的,否则就没有B,C,Dok,那么你可以使用外部连接,你到底想要什么,请画相同的,而我不知道如何把每件事都放在同一张表中,了解您使用该系统的目的是一个好主意。除此之外,试图获得一个“独特的”链接行将很难与您当前的设计;我相信大多数/所有的RDBMS都需要触发器,并且您基本上必须锁定表(并冒死锁风险)才能使其工作。你的其他解决方案解决了这个最初的问题,但我也不太喜欢它们;我们能得到更多的信息吗?这可能是一个表继承问题,但我认为MySQL不支持该功能。我完全理解,但每个B、C、D表都有10+个唯一的列,因此从长远来看合并它们似乎不是一个好主意,我将共享列保留在表A中,并将它们各自的唯一列保留在自己的表中。如果是这种情况,那么您展示的解决方案1和2也不是一个好的解决方案。因此,这意味着您可以坚持使用当前的db结构,您可以使用UNION ALL(对于所有公共字段),然后限制1,以确保只包含表B、C或D的一个匹配项。非常感谢您的回答,我有一个问题,在不影响性能的情况下,Product
表大概可以保留多少列/记录?我不知道MySQL的最高性能是什么(请查阅您的文档,但在达到实际的DB限制之前,您通常会遇到列计数的“良好设计”限制。对于行计数,这将取决于您使用的硬件以及您所说的“性能”——大多数现代RDBMS将1000行以下的数据完全存储在内存中。至少,您不会o需要一组好的索引。假设“服务器”硬件不错,在表中出现1 mil行之前,您可能不会有任何实际问题。。。
Product_Category
----------------
id -- autoincrement id
name -- varchar
Product
----------
id -- autoincrement id
productCategoryId -- fk referenct to Product_Category.id
name -- varchar
price -- decimal/numeric
(other columns as needed)
Attribute
------------
id -- autoincrement id
name -- varchar
type -- code
description -- varchar
Product_Attribute
-------------------
productId -- fk reference to Product.id
attributeId -- fk reference to Attribute.id
value -- varchar