You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/10/28 08:48:48 UTC

[shardingsphere] branch master updated: Optimize shadow docs (#13327)

This is an automated email from the ASF dual-hosted git repository.

panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 59d9f3a  Optimize shadow docs (#13327)
59d9f3a is described below

commit 59d9f3a4c4eebf63aec52251ebd70162acadd835
Author: gin <ja...@163.com>
AuthorDate: Thu Oct 28 16:48:05 2021 +0800

    Optimize shadow docs (#13327)
    
    * Optimize shadow docs.
    
    * Optimize name of method.
---
 docs/document/content/features/shadow/_index.cn.md |   8 +-
 docs/document/content/features/shadow/_index.en.md |  18 +-
 .../document/content/features/shadow/concept.cn.md |   2 +-
 .../document/content/features/shadow/concept.en.md |  18 +-
 .../content/features/shadow/use-norms.en.md        |   2 +-
 .../document/content/reference/shadow/_index.cn.md |  55 +++---
 .../document/content/reference/shadow/_index.en.md | 215 +++++++++++++++++++--
 .../configuration/java-api/shadow.cn.md            |   2 +-
 .../configuration/java-api/shadow.en.md            |   2 +-
 .../configuration/spring-boot-starter/shadow.cn.md |   2 +-
 .../configuration/spring-boot-starter/shadow.en.md |   4 +-
 .../configuration/spring-namespace/shadow.cn.md    |   2 +-
 .../configuration/spring-namespace/shadow.en.md    |  10 +-
 .../shadow/condition/ShadowColumnCondition.java    |   2 +-
 .../algorithm/ColumnShadowAlgorithmDeterminer.java |   2 +-
 .../dml/AbstractShadowDMLStatementRouteEngine.java |   8 +-
 .../dml/ShadowSelectStatementRoutingEngine.java    |   4 +-
 .../ShadowDeleteStatementRoutingEngineTest.java    |   2 +-
 .../ShadowInsertStatementRoutingEngineTest.java    |   6 +-
 .../ShadowSelectStatementRoutingEngineTest.java    |   2 +-
 .../ShadowUpdateStatementRoutingEngineTest.java    |   2 +-
 21 files changed, 272 insertions(+), 96 deletions(-)

diff --git a/docs/document/content/features/shadow/_index.cn.md b/docs/document/content/features/shadow/_index.cn.md
index 69f4aa0..5a8a18c 100644
--- a/docs/document/content/features/shadow/_index.cn.md
+++ b/docs/document/content/features/shadow/_index.cn.md
@@ -7,14 +7,14 @@ chapter = true
 
 ## 背景
 
-在基于微服务的分布式应用架构下,由于整体服务都是通过一系列的微服务调用、中间件调用来完成业务需求,所以对于单个服务的压测已经不能代表真实场景。
-而在线下环境中,如果重新搭建一整套与生产环境类似的压测环境,成本太高,并且往往无法模拟线上环境的体量以及复杂度。
+在基于微服务的分布式应用架构下,业务需要多个服务是通过一系列的服务、中间件的调用来完成,所以单个服务的压力测试已经不能代表真实场景。
+在测试环境中,如果重新搭建一整套与生产环境类似的压测环境,成本太高,并且往往无法模拟线上环境的体量以及复杂度。
 这种场景下,业内通常选择全链路压测的方式,即在生产环境进行压测,这样所获得的测试结果能够较为准确地反应系统真实容量水平和性能。
 
 ## 挑战
 
-全链路压测是一项复杂而庞大的工作,需要各个中间件、微服务之间相应的调整与配合,以应对不同流量以及压测标识的透传,通常应该有一整套压测平台与测试计划。
-其中,在数据库层面,为了保证生产数据的可靠性与完整性,做好数据隔离,需要将压测的数据请求打入影子库,以防压测数据写入生产数据库而对真实数据造成污染。
+全链路压测是一项复杂而庞大的工作。需要各个微服务、中间件之间配合与调整,以应对不同流量以及压测标识的透传。通常会搭建一整套压测平台以适用不同测试计划。
+在数据库层面需要做好数据隔离,为了保证生产数据的可靠性与完整性,需要将压测产生的数据路由到压测环境数据库,防止压测数据对生产数据库中真实数据造成污染。
 这就要求业务应用在执行 SQL 前,能够根据透传的压测标识,做好数据分类,将相应的 SQL 路由到与之对应的数据源。
 
 ## 目标
diff --git a/docs/document/content/features/shadow/_index.en.md b/docs/document/content/features/shadow/_index.en.md
index 7f04f3a..d4f188a 100644
--- a/docs/document/content/features/shadow/_index.en.md
+++ b/docs/document/content/features/shadow/_index.en.md
@@ -7,25 +7,25 @@ chapter = true
 
 ## Background
 
-Under the distributed application architecture based on microservices, since the overall service completes business requirements through a series of microservice calls and middleware calls, the stress testing of a single service can no longer represent the real scenario.
+Under the distributed application architecture based on microservices, business requires multiple services to be completed through a series of services and middleware calls. The pressure testing of a single service can no longer reflect the real scenario.
 
-In the offline environment, if you rebuild a complete set of stress testing environment similar to the production environment, the cost is too high, and it is often impossible to simulate the volume and complexity of the online environment.
+In the test environment, if you rebuild a complete set of pressure test environment similar to the production environment, the cost is too high. It is usually impossible to simulate the scale and complexity of the production environment.
 
-In this scenario, the industry usually chooses the full-link stress test method, that is, the stress test is performed in the production environment, so that the test results obtained can more accurately reflect the real capacity level and performance of the system.
+In this scenario, industry usually chooses the full-link pressure test method, that is, pressure test in the production environment. So the test results obtained can more accurately reflect the real capacity level and performance of the system.
 
 ## Challenges
 
-Full-link stress testing is a complex and huge task that requires corresponding adjustments and cooperation between various middleware and microservices to deal with the transparent transmission of different flows and stress test identifiers. 
-Usually there should be a complete set of stress test platform and test plan.
+Full-link pressure testing is a complex and huge task. Coordination and adjustments between microservices and middleware required to cope with the transparent transmission of different flow rates and pressure test marks. Usually we will build a complete set of pressure testing platform for different test plans.
 
-Among them, at the database level, in order to ensure the reliability and integrity of the production data and do a good job of data isolation, it is necessary to put pressure test data requests into the shadow database to prevent the pressure test data from being written into the production database and causing pollution to the real data.
+Data isolation have to be done at the database-level, in order to ensure the reliability and integrity of the production data, the data generated by pressure testing routed to the test database. 
+Prevent test data from polluting the real data in the production database.
 
 This requires business applications to perform data classification based on the transparently transmitted pressure test identification before executing SQL, and route the corresponding SQL to the corresponding data source.
 
 ## Goal
 
-Apache ShardingSphere focuses on database-level solutions in full-link stress testing scenarios.
+Apache ShardingSphere focuses on database-level solutions in full-link pressure testing scenarios.
 
-Kernel-based SQL analysis capabilities and a pluggable platform architecture realize the isolation of pressure test data and production data, help application automatic routing, and support full-link pressure test.
+Kernel-based SQL analysis capabilities and a pluggable platform architecture realize the isolation of pressure test data and production data, help application automatic routing, and support full-link pressure testing.
 
-It is the main design goal of the Apache ShardingSphere shadow database module.
+It is the main design goal of the Apache ShardingSphere shadow DB module.
diff --git a/docs/document/content/features/shadow/concept.cn.md b/docs/document/content/features/shadow/concept.cn.md
index 45ee375..17d081e 100644
--- a/docs/document/content/features/shadow/concept.cn.md
+++ b/docs/document/content/features/shadow/concept.cn.md
@@ -13,7 +13,7 @@ weight = 1
 
 ## 影子数据库
 
-进行压测数据隔离的影子数据库,与生产数据库应当使用相同的配置。
+压测数据隔离的影子数据库,与生产数据库应当使用相同的配置。
 
 ## 影子表
 
diff --git a/docs/document/content/features/shadow/concept.en.md b/docs/document/content/features/shadow/concept.en.md
index 2789d83..ec9f9b1 100644
--- a/docs/document/content/features/shadow/concept.en.md
+++ b/docs/document/content/features/shadow/concept.en.md
@@ -5,9 +5,9 @@ weight = 1
 
 ## Shadow DB Switch
 
-Shadow library switch.
+Shadow DB switch.
 
-A stress test is a demand for a specific period of time, and it can be turned on when needed.
+Pressure testing is a requirement for a specific period of time, turned on when needed.
 
 ## Production DB
 
@@ -15,30 +15,30 @@ The database used for production data.
 
 ## Shadow DB
 
-The database used for the test data.
+The Shadow database for Pressure testing data isolation.
 
 ## Shadow Table
 
-Perform pressure test data related tables.
+Pressure testing data related tables.
 
-It has the same table structure as the corresponding table in the production database.
+The shadow table has the same table structure in the production DB and shadow DB.
 
 ## Shadow Algorithm
 
 Provides 2 types of shadow algorithms.
 
-Since the shadow algorithm is closely related to business implementation, no default shadow algorithm is provided.
+Since the shadow algorithm is closely related to business, no default shadow algorithm provided.
 
 - Column shadow algorithm
   
-It is suitable for scenarios where the value of a field involved in the executed SQL satisfies certain matching conditions in the test.
+It is suitable for scenarios where the value of a field involved in the executed SQL satisfies certain matching conditions in the testing.
 
 - Note shadow algorithm
 
-It is suitable for scenarios where the field values involved in executing SQL cannot meet certain matching conditions in the test.
+It is suitable for scenarios where the field values involved in executing SQL cannot meet certain matching conditions in the testing.
 
 ## Default Shadow Algorithm
 
-Default shadow algorithm, optional item. For the default matching algorithm that is not configured with the shadow algorithm table.
+Default shadow algorithm, optional item. The default matching algorithm for table that is not configured with the shadow algorithm.
 
 **Note**: The default shadow algorithm only supports note shadow algorithm.
diff --git a/docs/document/content/features/shadow/use-norms.en.md b/docs/document/content/features/shadow/use-norms.en.md
index d7de0b1..54cfb45 100644
--- a/docs/document/content/features/shadow/use-norms.en.md
+++ b/docs/document/content/features/shadow/use-norms.en.md
@@ -41,7 +41,7 @@ Judge the inserted column and inserted value of `INSERT` operation
 
 * SELECT/UPDATE/DELETE statement
 
-Judge the fields and values included in the `WHERE` condition
+Judge the column and values included in the `WHERE` condition
 
 | *Condition* | *SQL* | *Support* |
 | -------- | --------- | --------- |
diff --git a/docs/document/content/reference/shadow/_index.cn.md b/docs/document/content/reference/shadow/_index.cn.md
index 9ef7b20..9574a53 100644
--- a/docs/document/content/reference/shadow/_index.cn.md
+++ b/docs/document/content/reference/shadow/_index.cn.md
@@ -20,11 +20,11 @@ Apache ShardingSphere 通过解析 SQL,对传入的 SQL 进行影子判定,
 
 **影子库映射**:生产数据源名称和影子数据源名称映射关系。
 
-**影子表**:压测相关的表,影子库中必须包含影子表。影子表需要指定对应的影子库映射和影子算法。
+**影子表**:压测相关的影子表。影子表必须存在于指定的影子库中,并且需要指定影子算法。
 
 **影子算法**:SQL 路由影子算法。
 
-**默认影子算法**:默认影子算法,选配项。对于没有配置影子算法表的默认匹配算法。
+**默认影子算法**:默认影子算法。选配项,对于没有配置影子算法表的默认匹配算法。
 
 ## 路由过程
 
@@ -33,19 +33,19 @@ Apache ShardingSphere 通过解析 SQL,对传入的 SQL 进行影子判定,
 执行影子路由判定流程,判定执行SQL满足影子规则的配置,数据路由到与之对应的影子库,生产数据则维持不变。
 
 ## 影子判定流程
-影子库开关开启时,会对执行的 SQL 语句进行影子判定。影子判定目前支持两种类型算法,用户可根据实际业务需求选择一种或者组合使用。
+影子库开关开启时,会对执行的 SQL 语句进行影子判定。影子判定支持两种类型算法,用户可根据实际业务需求选择一种或者组合使用。
 
 ### DML 语句
 
-支持两种算法。影子判定会首先判断执行 SQL 关联的表是否和影子表有交集。如果有交集,对交集部分影子表关联的影子算法依次判定。如果影子表关联影子算法有任何一个判定成功。SQL 语句路由到影子库。
-没有交集或者影子算法判定不成功,SQL 语句路由到生产库。
+支持两种算法。影子判定会首先判断执行 SQL 相关表与配置的影子表是否有交集。如果有交集,依次判定交集部分影子表关联的影子算法,有任何一个判定成功。SQL 语句路由到影子库。
+影子表没有交集或者影子算法判定不成功,SQL 语句路由到生产库。
 
 ### DDL 语句
 
-仅支持注解影子算法。一般不会对 DDL 语句的压力测试。主要做为影子库环境的初始化或者影子表调整时执行。
+仅支持注解影子算法。在压测场景下,DDL 语句一般不需要测试。主要在初始化或者修改影子库中影子表时使用。
 
-影子判定会首先判断执行 SQL 是否包含注解,如果包含注解对影子规则中的注解影子算法依次判定。如果注解影子算法有任何一个判定成功。SQL 语句路由到影子库。
-没有 SQL 不包含注解或者注解影子算法判定不成功,路由到生产库。
+影子判定会首先判断执行 SQL 是否包含注解。如果包含注解,影子规则中配置的注解影子算法依次判定。有任何一个判定成功。SQL 语句路由到影子库。
+执行 SQL 不包含注解或者注解影子算法判定不成功,SQL 语句路由到生产库。
 
 ## 影子算法
 
@@ -55,7 +55,7 @@ Apache ShardingSphere 通过解析 SQL,对传入的 SQL 进行影子判定,
 
 ### 场景需求
 
-假设一个电商网站要对下单业务进行压测,对订单表 `t_order` 进行压测。生产数据执行到生产库,即:ds。测试数据执行到影子库,即:ds-shadow。
+假设一个电商网站要对下单业务进行压测。压测相关表 `t_order` 为影子表,生产数据执行到 `ds` 生产数据库,压测数据执行到数据库 `ds_shadow` 影子库。
 
 ### 影子库配置
 
@@ -90,28 +90,26 @@ props:
   sql-comment-parse-enabled: true
 ```
 
-**注意**:
-- 如果使用注解影子算法,需要打开解析 SQL 注释配置项 `sql-comment-parse-enabled: true`。默认为关闭状态。
-  请参考[属性配置]( https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/configuration/props/)
+**注意**: 如果使用注解影子算法,需要开启解析 SQL 注释配置项 `sql-comment-parse-enabled: true`。默认关闭。 
+请参考 [配置项说明]( https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/configuration/props/)
 
+### 影子库环境
 
-### 影子库环境准备
+* 创建影子库 `ds_shadow`。
 
-* 创建影子库 `ds-shadow`。
-
-* 创建压测相关影子表,影子表结构与生产环境对应表结构必须一致。假设需要在影子库创建 `t_order` 表。创建表语句需要添加 SQL 注释 `/*shadow:true,foo:bar,...*/`。即:
+* 创建影子表,表结构与生产环境必须一致。假设在影子库创建 `t_order` 表。创建表语句需要添加 SQL 注释 `/*shadow:true,foo:bar,...*/`。即:
 
 ```sql
 CREATE TABLE t_order (order_id INT(11) primary key, user_id int(11) not null, ...) /*shadow:true,foo:bar,...*/
 ``` 
+
 执行到影子库。
 
 ### 影子算法使用
    
 1. 列影子算法使用
 
-假设 `t_order` 表中包含字段下单用户ID的 `user_id`。 如果实现的效果,当用户ID为 `0` 的用户创建订单产生的数据。 即:
-
+假设 `t_order` 表中包含下单用户ID的 `user_id` 列。 实现的效果,当用户ID为 `0` 的用户创建订单产生的数据。 即:
 ```sql
 INSERT INTO t_order (order_id, user_id, ...) VALUES (xxx..., 0, ...)
 ```
@@ -135,11 +133,13 @@ shadow-algorithms:
 
 2. 使用注解影子算法
 
-假设 `t_order` 表中没有存储可以对值进行控制的列。或者控制的值不包含在执行 SQL 的中。可以添加一条注解到执行的 SQL 中,即:
+假设 `t_order` 表中不包含可以对值进行匹配的列。添加注解 `/*shadow:true,foo:bar,...*/` 到执行 SQL 中,即:
+
 ```sql
 SELECT * FROM t_order WHERE order_id = xxx /*shadow:true,foo:bar,...*/ 
 ```
-会执行到影子库。
+
+会执行到影子库,其他数据执行到生产库。
 
 算法配置如下(YAML 格式展示):
 
@@ -154,14 +154,15 @@ shadow-algorithms:
 
 3. 混合使用影子模式
 
-假设对 `t_order` 表压测以上两种场景都需要覆盖。 即,
+假设对 `t_order` 表压测需要覆盖以上两种场景,即,
 
 ```sql
 INSERT INTO t_order (order_id, user_id, ...) VALUES (xxx..., 0, ...);
 
 SELECT * FROM t_order WHERE order_id = xxx /*shadow:true,foo:bar,...*/;
 ```
-满足对复杂场景压力测试支持。
+
+都会执行到影子库,其他数据执行到生产库。
 
 算法配置如下(YAML 格式展示):
 
@@ -187,13 +188,14 @@ shadow-algorithms:
 ```sql
 INSERT INTO t_order (order_id, user_id, ...) VALUES (xxx..., 0, ...);
 
-INSERT INTO t_order_item (order_item_id, order_id, ...) VALUES (xxx..., xxx..., ...) /*shadow:true,foo:bar,...*/;
+INSERT INTO t_xxx_1 (order_item_id, order_id, ...) VALUES (xxx..., xxx..., ...) /*shadow:true,foo:bar,...*/;
 
-SELECT * FROM t_order_item WHERE order_id = xxx /*shadow:true,foo:bar,...*/;
+SELECT * FROM t_xxx_2 WHERE order_id = xxx /*shadow:true,foo:bar,...*/;
 
-SELECT * FROM t_order_xxx WHERE order_id = xxx /*shadow:true,foo:bar,...*/;
+SELECT * FROM t_xxx_3 WHERE order_id = xxx /*shadow:true,foo:bar,...*/;
 ```
-都会执行到影子库。
+
+都会执行到影子库,其他数据执行到生产库。
 
 配置如下(YAML 格式展示):
 
@@ -226,6 +228,5 @@ shadow-algorithms:
 props:
   sql-comment-parse-enabled: true
 ```
-我们只需要配置默认影子算法 `default-shadow-algorithm-name`。 除了影子表 `t_order` 其它相关表都会进行默认影子算法的判定。
 
 **注意**:默认影子算法仅支持注解影子算法。
diff --git a/docs/document/content/reference/shadow/_index.en.md b/docs/document/content/reference/shadow/_index.en.md
index 2601ded..852230f 100644
--- a/docs/document/content/reference/shadow/_index.en.md
+++ b/docs/document/content/reference/shadow/_index.en.md
@@ -17,60 +17,235 @@ Shadow rules include shadow data source mapping, shadow tables, and shadow algor
 
 ![Shadow Rule](https://shardingsphere.apache.org/document/current/img/shadow/rule_en.png)
 
-**enable**:Shadow DB switch, The default value is `false`. Optional value `true`/`false`.
+**enable**:Shadow DB switch. Optional value `true`/`false`, default value is `false`.
 
 **data-sources**:Production data source name and shadow data source name mappings.
 
-**tables**:For tables related to stress testing, shadow tables must be included in the shadow library. 
-The shadow table needs to specify the corresponding shadow library mapping and shadow algorithm.
+**tables**:Shadow tables related to stress testing. Shadow tables must exist in the specified shadow DB, and the shadow algorithm needs to be specified.
 
 **shadow-algorithms**:SQL routing shadow algorithm.
 
-**default-shadow-algorithm-name**:Default shadow algorithm, optional item. For the default matching algorithm that is not configured with the shadow algorithm table.
+**default-shadow-algorithm-name**:Default shadow algorithm. Optional item, the default matching algorithm for tables that not configured with the shadow algorithm.
 
 ## Routing Process
 
-Take the INSERT statement as an example, When writing data, Apache ShardingSphere will parse the SQL, and then construct a routing chain according to the rules in the configuration file.
+Take the INSERT statement as an example. When writing data Apache ShardingSphere will parse the SQL, and then construct a routing chain according to the rules in the configuration file.
 
 In the current version of the function, the shadow function is the last execution unit in the routing chain, that is, if there are other rules that require routing, such as sharding, Apache ShardingSphere will first route to a certain database according to the sharding rules, and then
 perform the shadow routing decision process.
 
-It is determined that the execution of SQL satisfies the configuration of the shadow rule, the data is routed to the corresponding shadow database, and the production data remains unchanged.
+It determined that the execution of SQL satisfies the configuration of the shadow rule, the data routed to the corresponding shadow database, and the production data remains unchanged.
 
 ## Shadow Judgment Process
 
-When the shadow library switch is turned on, a shadow judgment will be made on the executed SQL statement.
+When the shadow DB switch turned on, shadow judgment will be made on the executed SQL statements.
 
-Shadow judgment currently supports two types of algorithms, and users can choose one or combine them according to actual business needs.
+Shadow judgment supports two types of algorithms, users can choose one or combine them according to actual business needs.
 
 ### DML Statement
 
-Support two shadow algorithms.
+Support two type shadow algorithms.
 
-The shadow judgment first judges whether the table associated with the SQL execution has an intersection with the shadow table.
+The shadow judgment first judges whether there is an intersection between SQL related tables and configured shadow tables.
 
-If there is an intersection, the shadow algorithm associated with the shadow table of the intersection is determined in turn.
+If there is an intersection, determine the shadow algorithm associated with the shadow table of the intersection in turn,and any one of them was successful. SQL statement executed shadow DB.
 
-If any of the shadow algorithms associated with the shadow table succeeds, the SQL statement is routed to the shadow database.
-
-If there is no intersection or the shadow algorithm is unsuccessful, the SQL statement is routed to the production database.
+If shadow tables have no intersection, or shadow algorithms are unsuccessful, SQL statement executed production DB.
 
 ### DDL Statement
 
 Only support note shadow algorithm.
 
-Generally, there is no stress test on DDL statements. It is mainly used for the initialization of the shadow library environment or the adjustment of the shadow table.
+In the pressure testing scenarios, DDL statements are not need tested generally. It is mainly used when initializing or modifying the shadow table in the shadow DB.
 
-The shadow determination will first determine whether the executed SQL contains annotations, and if it contains annotations, the shadow algorithm of the annotations in the shadow rule will be determined in turn.
+The shadow judgment first judges whether the executed SQL contains notes. 
 
-If any one of the annotation shadow algorithms succeeds, the SQL statement is routed to the shadow library.
+If contains notes, determine the note shadow algorithms in the shadow rule in turn, and any one of them was successful. SQL statement executed shadow DB.
 
-No SQL does not contain annotations or the annotation shadow algorithm is unsuccessful and is routed to the production database.
+The executed SQL does not contain notes, or shadow algorithms are unsuccessful, SQL statement executed production DB.
 
 ## Shadow Algorithm
 
-Shadow algorithm details, See the [List of built-in shadow algorithms](/en/user-manual/shardingsphere-jdbc/configuration/built-in-algorithm/shadow)
+Shadow algorithm details, please refer to [List of built-in shadow algorithms](/en/user-manual/shardingsphere-jdbc/configuration/built-in-algorithm/shadow)
 
 ## Use Example
 
-TODO
+### Scenario
+
+Assume that the e-commerce website wants to perform pressure testing on the order business,
+
+the pressure testing related table `t_order` is a shadow table,the production data executed to the `ds` production DB, and the pressure testing data executed to the database `ds_shadow` shadow DB.
+
+### Shadow DB configuration
+
+The shadow configuration for example(YAML):
+
+```yaml
+enable: true
+  data-sources:
+    shadow-data-source:
+      source-data-source-name: ds
+      shadow-data-source-name: ds-shadow
+tables:
+  t_order:
+    data-source-names: shadow-data-source
+    shadow-algorithm-names:
+      - simple-note-algorithm
+      - user-id-match-algorithm
+shadow-algorithms:
+  simple-note-algorithm:
+    type: SIMPLE_NOTE
+    props:
+      shadow: true
+      foo: bar
+  user-id-match-algorithm:
+    type: COLUMN_VALUE_MATCH
+    props:
+      operation: insert
+      column: user_id
+      value: 0
+      
+props:
+  sql-comment-parse-enabled: true
+```
+
+**Note**: If you use the annotation shadow algorithm, the parse SQL comment configuration item `sql-comment-parse-enabled: true` need to be turned on. turned off by default.
+please refer to [Configuration Props]( https://shardingsphere.apache.org/document/current/en/user-manual/shardingsphere-jdbc/configuration/props/) 
+
+### Shadow DB environment
+
+* Create the shadow DB `ds_shadow`.
+
+* Create shadow tables, tables structure must be consistent with the production environment. 
+  Assume that the `t_order` table created in the shadow DB. Create table statement need to add SQL note `/*shadow:true,foo:bar,.. .*/`.
+
+```sql
+CREATE TABLE t_order (order_id INT(11) primary key, user_id int(11) not null, ...) /*shadow:true,foo:bar,...*/
+``` 
+Execute to the shadow DB.
+
+### Shadow algorithm example
+
+1. Column shadow algorithm example
+
+Assume that the `t_order` table contains a list of `user_id` to store the order user ID.
+The data of the order created by the user whose user ID is `0` executed to shadow DB, other data executed to production DB.
+
+```sql
+INSERT INTO t_order (order_id, user_id, ...) VALUES (xxx..., 0, ...)
+```
+
+No need to modify any SQL or code, only need to control the data of the testing to realize the pressure testing.
+
+Column Shadow algorithm configuration (YAML):
+
+```yaml
+shadow-algorithms:
+  user-id-match-algorithm:
+    type: COLUMN_VALUE_MATCH
+    props:
+      operation: insert
+      column: user_id
+      value: 0
+```
+
+**Note**: When the shadow table uses the column shadow algorithm, the same type of shadow operation (INSERT, UPDATE, DELETE, SELECT) currently only supports a single column.
+
+2. Note shadow algorithm example
+
+Assume that the `t_order` table does not contain columns that can matching. Executed SQL statement need to add SQL note `/*shadow:true,foo:bar,.. .*/`
+
+```sql
+SELECT * FROM t_order WHERE order_id = xxx /*shadow:true,foo:bar,...*/ 
+```
+SQL executed to shadow DB, other data executed to production DB.
+
+Note Shadow algorithm configuration (YAML):
+
+```yaml
+shadow-algorithms:
+  simple-note-algorithm:
+    type: SIMPLE_NOTE
+    props:
+      shadow: true
+      foo: bar
+```
+
+3. Hybrid two shadow algorithm example
+
+Assume that the pressure testing of the `t_order` gauge needs to cover the above two scenarios.
+
+```sql
+INSERT INTO t_order (order_id, user_id, ...) VALUES (xxx..., 0, ...);
+
+SELECT * FROM t_order WHERE order_id = xxx /*shadow:true,foo:bar,...*/;
+```
+
+Both will be executed to shadow DB, other data executed to production DB.
+
+2 type of shadow algorithm example (YAML):
+
+```yaml
+shadow-algorithms:
+  user-id-match-algorithm:
+    type: COLUMN_VALUE_MATCH
+    props:
+      operation: insert
+      column: user_id
+      value: 0
+  simple-note-algorithm:
+    type: SIMPLE_NOTE
+    props:
+      shadow: true
+      foo: bar
+```
+
+4. Default shadow algorithm example
+
+Assume that the column shadow algorithm used for the `t_order`, all other shadow tables need to use the note shadow algorithm.
+
+```sql
+INSERT INTO t_order (order_id, user_id, ...) VALUES (xxx..., 0, ...);
+
+INSERT INTO t_xxx_1 (order_item_id, order_id, ...) VALUES (xxx..., xxx..., ...) /*shadow:true,foo:bar,...*/;
+
+SELECT * FROM t_xxx_2 WHERE order_id = xxx /*shadow:true,foo:bar,...*/;
+
+SELECT * FROM t_xxx_3 WHERE order_id = xxx /*shadow:true,foo:bar,...*/;
+```
+
+Both will be executed to shadow DB, other data executed to production DB.
+
+Default shadow algorithm configuration (YAML):
+
+```yaml
+enable: true
+  data-sources:
+    shadow-data-source:
+      source-data-source-name: ds
+      shadow-data-source-name: ds-shadow
+tables:
+  t_order:
+    data-source-names: shadow-data-source
+    shadow-algorithm-names:
+      - simple-note-algorithm
+      - user-id-match-algorithm
+default-shadow-algorithm-name: simple-note-algorithm
+shadow-algorithms:
+  simple-note-algorithm:
+    type: SIMPLE_NOTE
+    props:
+      shadow: true
+      foo: bar
+  user-id-match-algorithm:
+    type: COLUMN_VALUE_MATCH
+    props:
+      operation: insert
+      column: user_id
+      value: 0
+      
+props:
+  sql-comment-parse-enabled: true
+```
+
+**Note**: The default shadow algorithm only supports note shadow algorithm.
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/configuration/java-api/shadow.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/configuration/java-api/shadow.cn.md
index c1f56c9..c409b3b 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/configuration/java-api/shadow.cn.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/configuration/java-api/shadow.cn.md
@@ -11,7 +11,7 @@ weight = 4
 
 | *名称* | *数据类型* | *说明* | *默认值* |
 | ------ | ---------- | ------ | -------- |
-| enable | boolean    | 影子库功能开关。可选值:true/false |false|
+| enable | boolean    | 影子库开关。可选值:true/false |false|
 | dataSources | Map\<String, ShadowDataSourceConfiguration\> | 影子数据源映射名称和配置 |无|
 | tables | Map\<String, ShadowTableConfiguration\> | 影子表名称和配置 |无|
 | defaultShadowAlgorithmName | String | 默认影子算法名称 | 选配项 |
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/configuration/java-api/shadow.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/configuration/java-api/shadow.en.md
index 7d7bef7..92e12e6 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/configuration/java-api/shadow.en.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/configuration/java-api/shadow.en.md
@@ -11,7 +11,7 @@ Attributes:
 
 | *Name* | *DataType* | *Description* | *Default Value* |
 | ------ | ---------- | ------------- | --------------- |
-| enable | boolean    | Shadow DB function switch. Optional values: true/false |false|
+| enable | boolean    | Shadow DB switch. Optional values: true/false |false|
 | dataSources | Map\<String, ShadowDataSourceConfiguration\> | Shadow data source mapping name and configuration | None |
 | tables | Map\<String, ShadowTableConfiguration\> | Shadow table name and configuration | None |
 | defaultShadowAlgorithmName | String | default shadow algorithm name | Option item |
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-boot-starter/shadow.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-boot-starter/shadow.cn.md
index c9ea917..399b531 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-boot-starter/shadow.cn.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-boot-starter/shadow.cn.md
@@ -8,7 +8,7 @@ weight = 4
 ```properties
 spring.shardingsphere.datasource.names= # 省略数据源配置,请参考使用手册
 
-spring.shardingsphere.rules.shadow.enable= # Shadow功能开关。 可选值:true/false,默认为false
+spring.shardingsphere.rules.shadow.enable= # 影子库开关。 可选值:true/false,默认为false
 
 spring.shardingsphere.rules.shadow.data-sources.shadow-data-source.source-data-source-name= # 生产数据源名称
 spring.shardingsphere.rules.shadow.data-sources.shadow-data-source.shadow-data-source-name= # 影子数据源名称
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-boot-starter/shadow.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-boot-starter/shadow.en.md
index 5f0342c..fb2bf2b 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-boot-starter/shadow.en.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-boot-starter/shadow.en.md
@@ -8,7 +8,7 @@ weight = 4
 ```properties
 spring.shardingsphere.datasource.names= # Omit the data source configuration, please refer to the usage
 
-spring.shardingsphere.rules.shadow.enable= # Shadow function switch. Optional values: true/false, the default is false
+spring.shardingsphere.rules.shadow.enable= # Shadow DB switch. Optional values: true/false, the default is false
 
 spring.shardingsphere.rules.shadow.data-sources.shadow-data-source.source-data-source-name= # Production data source name
 spring.shardingsphere.rules.shadow.data-sources.shadow-data-source.shadow-data-source-name= # Shadow data source name
@@ -16,7 +16,7 @@ spring.shardingsphere.rules.shadow.data-sources.shadow-data-source.shadow-data-s
 spring.shardingsphere.rules.shadow.tables.<table-name>.data-source-names= # Shadow table location shadow data source names (multiple values are separated by ",")
 spring.shardingsphere.rules.shadow.tables.<table-name>.shadow-algorithm-names= # Shadow table location shadow algorithm names (multiple values are separated by ",")
 
-spring.shardingsphere.rules.shadow.defaultShadowAlgorithmName= # default shadow algorithm name,optional item.
+spring.shardingsphere.rules.shadow.defaultShadowAlgorithmName= # Default shadow algorithm name,optional item.
 
 spring.shardingsphere.rules.shadow.shadow-algorithms.<shadow-algorithm-name>.type= # Shadow algorithm type
 spring.shardingsphere.rules.shadow.shadow-algorithms.<shadow-algorithm-name>.props.xxx= # Shadow algorithm property configuration
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-namespace/shadow.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-namespace/shadow.cn.md
index d852f15..7391002 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-namespace/shadow.cn.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-namespace/shadow.cn.md
@@ -12,7 +12,7 @@ weight = 4
 | *名称* | *类型*  | *说明* |
 | ----- | ------ | ------ |
 | id    | 属性    | Spring Bean Id |
-| enable | 属性   | Shadow功能开关。 可选值:true/false,默认为false |
+| enable | 属性   | Shadow库开关。 可选值:true/false,默认为false |
 | data-source(?)  | 标签  | 影子数据源配置 |
 | default-shadow-algorithm-name(?)  | 标签  | 默认影子算法配置 |
 | shadow-table(?) | 标签  | 影子表配置 |
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-namespace/shadow.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-namespace/shadow.en.md
index b364744..244be32 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-namespace/shadow.en.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/configuration/spring-namespace/shadow.en.md
@@ -12,7 +12,7 @@ Namespace: [http://shardingsphere.apache.org/schema/shardingsphere/shadow/shadow
 | *Name* | *Type*  | *Description* |
 | ------ | ------- | ------------- |
 | id     | Attribute | Spring Bean Id |
-| enable | Attribute | Shadow function switch. Optional values: true/false, the default is false |
+| enable | Attribute | Shadow DB switch. Optional values: true/false, the default is false |
 | data-source(?)  | Tag | Shadow data source configuration |
 | default-shadow-algorithm-name(?)  | Tag  | Default shadow algorithm configuration |
 | shadow-table(?) | Tag | Shadow table configuration |
@@ -46,8 +46,8 @@ Namespace: [http://shardingsphere.apache.org/schema/shardingsphere/shadow/shadow
 
 \<shadow:shadow-algorithm />
 
-| *名称*    | *类型* | *说明*        |
+| *Name*    | *Type* | *Description*        |
 | --------- | ----- | ------------- |
-| id        | 属性  | Shadow algorithm name |
-| type      | 属性  | Shadow algorithm type |
-| props (?) | 标签  | Shadow algorithm property configuration |
+| id        | Attribute  | Shadow algorithm name |
+| type      | Attribute  | Shadow algorithm type |
+| props (?) | Attribute  | Shadow algorithm property configuration |
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/condition/ShadowColumnCondition.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/condition/ShadowColumnCondition.java
index ea1e09f..921bf46 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/condition/ShadowColumnCondition.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/condition/ShadowColumnCondition.java
@@ -29,7 +29,7 @@ import java.util.Collection;
 @Getter
 public final class ShadowColumnCondition {
     
-    private final String table;
+    private final String owner;
     
     private final String column;
     
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/determiner/algorithm/ColumnShadowAlgorithmDeterminer.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/determiner/algorithm/ColumnShadowAlgorithmDeterminer.java
index c5ee5e8..7cb694e 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/determiner/algorithm/ColumnShadowAlgorithmDeterminer.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/determiner/algorithm/ColumnShadowAlgorithmDeterminer.java
@@ -50,7 +50,7 @@ public final class ColumnShadowAlgorithmDeterminer implements ShadowAlgorithmDet
     
     private boolean isShadowColumn(final ShadowColumnCondition shadowColumnCondition, final ShadowRule shadowRule, final String tableName, final ShadowOperationType operationType) {
         for (PreciseColumnShadowValue<Comparable<?>> each : createColumnShadowValues(shadowColumnCondition.getColumn(), shadowColumnCondition.getValues(), tableName, operationType)) {
-            if (!tableName.equals(shadowColumnCondition.getTable()) || !columnShadowAlgorithm.isShadow(shadowRule.getAllShadowTableNames(), each)) {
+            if (!tableName.equals(shadowColumnCondition.getOwner()) || !columnShadowAlgorithm.isShadow(shadowRule.getAllShadowTableNames(), each)) {
                 return false;
             }
         }
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/AbstractShadowDMLStatementRouteEngine.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/AbstractShadowDMLStatementRouteEngine.java
index 2613aaa..c810108 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/AbstractShadowDMLStatementRouteEngine.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/AbstractShadowDMLStatementRouteEngine.java
@@ -93,13 +93,13 @@ public abstract class AbstractShadowDMLStatementRouteEngine implements ShadowRou
     
     private boolean isShadowTable(final String tableName, final ShadowRule shadowRule, final ShadowOperationType shadowOperationType) {
         ShadowDetermineCondition shadowCondition = new ShadowDetermineCondition(tableName, shadowOperationType);
-        if (isShadowSqlNote(tableName, shadowRule, shadowCondition)) {
+        if (isContainsShadowInSqlNotes(tableName, shadowRule, shadowCondition)) {
             return true;
         }
-        return isShadowColumn(tableName, shadowRule, shadowCondition);
+        return isContainsShadowInColumns(tableName, shadowRule, shadowCondition);
     }
     
-    private boolean isShadowSqlNote(final String tableName, final ShadowRule shadowRule, final ShadowDetermineCondition shadowCondition) {
+    private boolean isContainsShadowInSqlNotes(final String tableName, final ShadowRule shadowRule, final ShadowDetermineCondition shadowCondition) {
         return parseSqlNotes().filter(strings -> shadowRule.getRelatedNoteShadowAlgorithms(tableName)
                 .filter(shadowAlgorithms -> isMatchAnyNoteShadowAlgorithms(shadowAlgorithms, shadowCondition.initSqlNotes(strings), shadowRule)).isPresent()).isPresent();
     }
@@ -117,7 +117,7 @@ public abstract class AbstractShadowDMLStatementRouteEngine implements ShadowRou
         return ShadowDeterminerFactory.newInstance(noteShadowAlgorithm).isShadow(shadowCondition, shadowRule);
     }
     
-    private boolean isShadowColumn(final String tableName, final ShadowRule shadowRule, final ShadowDetermineCondition shadowCondition) {
+    private boolean isContainsShadowInColumns(final String tableName, final ShadowRule shadowRule, final ShadowDetermineCondition shadowCondition) {
         return shadowRule.getRelatedColumnShadowAlgorithms(tableName, shadowCondition.getShadowOperationType()).filter(shadowAlgorithms -> parseShadowColumnConditions()
                 .filter(columnConditions -> isMatchAnyColumnShadowAlgorithms(shadowAlgorithms, shadowCondition.initShadowColumnCondition(columnConditions), shadowRule)).isPresent()).isPresent();
     }
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRoutingEngine.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRoutingEngine.java
index 0618081..f7575b4 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRoutingEngine.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRoutingEngine.java
@@ -61,10 +61,10 @@ public final class ShadowSelectStatementRoutingEngine extends AbstractShadowDMLS
     
     private void parseExpressionSegment(final ExpressionSegment expressionSegment, final Collection<ShadowColumnCondition> shadowColumnConditions) {
         ShadowExtractor.extractColumn(expressionSegment).ifPresent(columnSegment -> ShadowExtractor.extractValues(expressionSegment, parameters)
-                .ifPresent(values -> shadowColumnConditions.add(new ShadowColumnCondition(extractTableName(columnSegment), columnSegment.getIdentifier().getValue(), values))));
+                .ifPresent(values -> shadowColumnConditions.add(new ShadowColumnCondition(extractOwnerName(columnSegment), columnSegment.getIdentifier().getValue(), values))));
     }
     
-    private String extractTableName(final ColumnSegment columnSegment) {
+    private String extractOwnerName(final ColumnSegment columnSegment) {
         Optional<OwnerSegment> owner = columnSegment.getOwner();
         return owner.isPresent() ? getTableAliasNameMappings().get(owner.get().getIdentifier().getValue()) : getTableAliasNameMappings().keySet().iterator().next();
     }
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowDeleteStatementRoutingEngineTest.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowDeleteStatementRoutingEngineTest.java
index a1d0195..74c1f3b 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowDeleteStatementRoutingEngineTest.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowDeleteStatementRoutingEngineTest.java
@@ -96,7 +96,7 @@ public final class ShadowDeleteStatementRoutingEngineTest {
         Iterator<ShadowColumnCondition> iterator = shadowColumns.iterator();
         ShadowColumnCondition userId = iterator.next();
         assertThat(userId.getColumn(), is("user_id"));
-        assertThat(userId.getTable(), is("t_order"));
+        assertThat(userId.getOwner(), is("t_order"));
         assertThat(userId.getValues().iterator().next(), is("1"));
         Optional<Collection<String>> sqlNotes = shadowDeleteStatementRoutingEngine.parseSqlNotes();
         assertThat(sqlNotes.isPresent(), is(true));
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowInsertStatementRoutingEngineTest.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowInsertStatementRoutingEngineTest.java
index 83d626d..cb25688 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowInsertStatementRoutingEngineTest.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowInsertStatementRoutingEngineTest.java
@@ -101,15 +101,15 @@ public final class ShadowInsertStatementRoutingEngineTest {
         Iterator<ShadowColumnCondition> iterator = shadowColumns.iterator();
         ShadowColumnCondition userId = iterator.next();
         assertThat(userId.getColumn(), is("user_id"));
-        assertThat(userId.getTable(), is("t_order"));
+        assertThat(userId.getOwner(), is("t_order"));
         assertThat(userId.getValues().iterator().next(), is("1"));
         ShadowColumnCondition orderCode = iterator.next();
         assertThat(orderCode.getColumn(), is("order_code"));
-        assertThat(orderCode.getTable(), is("t_order"));
+        assertThat(orderCode.getOwner(), is("t_order"));
         assertThat(orderCode.getValues().iterator().next(), is("orderCode"));
         ShadowColumnCondition orderName = iterator.next();
         assertThat(orderName.getColumn(), is("order_name"));
-        assertThat(orderName.getTable(), is("t_order"));
+        assertThat(orderName.getOwner(), is("t_order"));
         assertThat(orderName.getValues().iterator().next(), is("orderName"));
         Optional<Collection<String>> sqlNotes = shadowRouteEngine.parseSqlNotes();
         assertThat(sqlNotes.isPresent(), is(true));
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRoutingEngineTest.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRoutingEngineTest.java
index 6cb5659..e1b5f10 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRoutingEngineTest.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRoutingEngineTest.java
@@ -96,7 +96,7 @@ public final class ShadowSelectStatementRoutingEngineTest {
         Iterator<ShadowColumnCondition> iterator = shadowColumns.iterator();
         ShadowColumnCondition userId = iterator.next();
         assertThat(userId.getColumn(), is("user_id"));
-        assertThat(userId.getTable(), is("t_order"));
+        assertThat(userId.getOwner(), is("t_order"));
         assertThat(userId.getValues().iterator().next(), is("1"));
         Optional<Collection<String>> sqlNotes = shadowRouteEngine.parseSqlNotes();
         assertThat(sqlNotes.isPresent(), is(true));
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowUpdateStatementRoutingEngineTest.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowUpdateStatementRoutingEngineTest.java
index ef0a234..935e796 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowUpdateStatementRoutingEngineTest.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowUpdateStatementRoutingEngineTest.java
@@ -97,7 +97,7 @@ public final class ShadowUpdateStatementRoutingEngineTest {
         Iterator<ShadowColumnCondition> iterator = shadowColumns.iterator();
         ShadowColumnCondition userId = iterator.next();
         assertThat(userId.getColumn(), is("user_id"));
-        assertThat(userId.getTable(), is("t_order"));
+        assertThat(userId.getOwner(), is("t_order"));
         assertThat(userId.getValues().iterator().next(), is("1"));
         Optional<Collection<String>> sqlNotes = shadowRouteEngine.parseSqlNotes();
         assertTrue(sqlNotes.isPresent());