任务是从敏感系统中提取客户和订单数据。数据存储在MySQL数据库中。
一个客户可以与许多订单相关联。一个简单的LEFT JOIN即可准确满足我的需求:
---------------------------------------------------------
| customer_id | order_id | order_quantity | order_value |
---------------------------------------------------------
| 1 | 100 | 3 | 100.00 |
| 1 | 105 | 12 | 400.00 |
| 2 | 103 | 2 | 75.00 |
---------------------------------------------------------
但是,在生成的摘录中,不允许我显示customer_id
或order_id
。相反,这些ID必须替换为数据导出时生成的随机的匿名标识符。
仍然需要在提取的数据导出结果中维护客户与其订单之间的关系。
所需结果:
-------------------------------------------------------------------
| anon_customer_id | anon_order_id | order_quantity | order_value |
-------------------------------------------------------------------
| xyz | abc123 | 3 | 100.00 |
| xyz | def567 | 12 | 400.00 |
| pqr | hij890 | 2 | 75.00 |
-------------------------------------------------------------------
是否有一种方法可以生成anon_customer_id
和anon_order_id
作为我正在构建数据结果的SELECT
的一部分?
答案 0 :(得分:2)
一种选择是使用MySQL的本机加密方法,例如SHA1
或SHA2
,然后创建一个VIEW进行查询并加入。
我选择使用SHA 512,因为它具有非常低的概率,不同的数据可以生成相同的哈希值。
CREATE VIEW Table1_VIEW AS (
SELECT
<table>.*
, SHA2(<table>.customer_id, 512) AS anon_customer_id
, SHA2(<table>.order_id, 512) AS anon_order_id
FROM
<table>
)
查询和结果
SELECT
*
FROM
Table1_VIEW
| customer_id | order_id | order_quantity | order_value | anon_customer_id | anon_order_id |
| ----------- | -------- | -------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| 1 | 100 | 3 | 100 | 4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a | 643c30f73a3017050b287794fc8c5bb9ab06b9ce38a1fc58df402a8b66ff58f69bf0a606ae17585352a0306f0e9752de8c5c064aed7003f52808b43ff992a603 |
| 1 | 105 | 12 | 400 | 4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a | 03d25c7071bce10d6b462d53854b969d9f61b982e3aee8771bdcca1ecb70495574e6929042f52e859ee9a253b58f776514180ff16e1338f5505e86c7ff328f72 |
| 2 | 103 | 2 | 75 | 40b244112641dd78dd4f93b6c9190dd46e0099194d5a44257b7efad6ef9ff4683da1eda0244448cb343aa688f5d3efd7314dafe580ac0bcbf115aeca9e8dc114 | 947de04bfae0bf062a66fc055d4c284c9779793d9bd58833ee7549fde1ff1effaf7aefdbc6c90ed0ac86c0acc82329e7c057d900c28ea7ed4724486f717ee38d |
p.s您也可以直接在SHA2()
课间直接使用JOIN
。
示例查询
SELECT
table11.*
, SHA2(table11.customer_id, 512) AS anon_customer_id
, SHA2(table11.order_id, 512) AS anon_order_id
FROM
Table1 table11
LEFT JOIN
Table1 table12
ON
table11.customer_id = table12.customer_id
仅适用于MYSQL 5.7 +
如果您至少拥有MySQL 5.7+,那么您还有一个更好的选择。
就是generated columns
CREATE TABLE Table1 (
`customer_id` INTEGER,
`order_id` INTEGER,
`order_quantity` INTEGER,
`order_value` INTEGER,
anon_customer_id VARCHAR(255) AS ( SHA2(Table1.customer_id, 512) ) VIRTUAL,
anon_order_id VARCHAR(255) AS ( SHA2(Table1.order_id, 512) ) VIRTUAL
);
答案 1 :(得分:0)
您可以使用任何哈希函数,例如MD5:
SELECT MD5(customer_id) AS anon_customer_id FROM customers;
但是请注意,MD5并不是很安全:https://security.stackexchange.com/questions/19906/is-md5-considered-insecure