Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL:查找与给定记录相关的记录的最快查询是什么_Mysql_Sql - Fatal编程技术网

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中只有一条记录
  • 我能做些什么来改进结构,以便使用更快的查询实现我想要的功能?我在考虑两种解决方案,但我不确定这是否是一种好的做法
解决方案1:

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