gpt4 book ai didi

mysql - 具有 90% 相同列的两个不同表的最佳设计

转载 作者:行者123 更新时间:2023-11-29 15:27:10 24 4
gpt4 key购买 nike

我有一个 feature_values 表,其中包含用户存储的数据:他们可以编辑和更新此表。

user_feature_values
user | year | quarter | gdp | other
---------------------------------------
1 2018 Q1 1.5 1.2
1 2018 Q2 1.6 1.5
5 2017 Q1 -1.2 1.0
.......................................
.............
4 2017 Q4 1.0 2.5

还有另一个类似的表存储默认值。用户无法编辑此内容。

default_feature_values
country | year | quarter | gdp | other
---------------------------------------
5 2018 Q1 1.8 2.0
10 2015 Q2 1.4 1.2
120 2017 Q3 -1.2 1.0
.......................................
.............
115 2016 Q4 1.5 2.15

当前情况:创建用户后,我实际上根据用户所在的国家/地区将默认值复制到 user_feature_values 中。这样他们就可以用自己的值编辑表中的默认值。稍后,他们可以选择默认值;将从 default_feature_values 表复制到 user_feature_values 表。

这是一个糟糕的设计吗?

这可以实现得如何?

最佳答案

你可以在 SQL Server 上使用这个解决方案,但我想这种方式只需稍加改变就可以很好地用于 mysql(我对 mysql 没有任何想法):

第1步:像这样的查询创建链接服务器(或在对象资源管理器中设置其他方式):

USE [master]
GO

EXEC master.dbo.sp_addlinkedserver @server = N'SetMainDBaddressHERE', @srvproduct=N'SQL Server'
/* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'SetMainDBaddressHERE',@useself=N'False',@locallogin=NULL,@rmtuser=N'DBuserName(like sa)',@rmtpassword='########'
GO

EXEC master.dbo.sp_serveroption @server=N'SetMainDBaddressHERE', @optname=N'collation compatible', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'SetMainDBaddressHERE', @optname=N'data access', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'SetMainDBaddressHERE', @optname=N'dist', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'SetMainDBaddressHERE', @optname=N'pub', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'SetMainDBaddressHERE', @optname=N'rpc', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'SetMainDBaddressHERE', @optname=N'rpc out', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'SetMainDBaddressHERE', @optname=N'sub', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'SetMainDBaddressHERE', @optname=N'connect timeout', @optvalue=N'0'
GO

EXEC master.dbo.sp_serveroption @server=N'SetMainDBaddressHERE', @optname=N'collation name', @optvalue=null
GO

EXEC master.dbo.sp_serveroption @server=N'SetMainDBaddressHERE', @optname=N'lazy schema validation', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'SetMainDBaddressHERE', @optname=N'query timeout', @optvalue=N'0'
GO

EXEC master.dbo.sp_serveroption @server=N'SetMainDBaddressHERE', @optname=N'use remote collation', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'SetMainDBaddressHERE', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO

第2步:使用information_schema.columns进行比较和更改命令,如下所示:

with t as(
select TABLE_NAME,column_name,s.DATA_TYPE,s.CHARACTER_MAXIMUM_LENGTH,
case when TABLE_NAME like 'vw_%' then N'Alter view as other DB'
when CHARACTER_MAXIMUM_LENGTH is null and s.DATA_TYPE in ('image','datetime') then 'Alter table '+TABLE_NAME+' add '+column_name+' '+s.DATA_TYPE
when CHARACTER_MAXIMUM_LENGTH is null then 'Alter table '+TABLE_NAME+' add '+column_name+' '+s.DATA_TYPE +' null'
else 'Alter table '+TABLE_NAME+' add '+column_name+' '+s.DATA_TYPE +'('+convert(nvarchar,CHARACTER_MAXIMUM_LENGTH)+')'
end as Command
from [MainServerDBadress].DBname.INFORMATION_SCHEMA.COLUMNS s where TABLE_NAME like 'vw_%' or TABLE_NAME like 'tbl_%'
)
Select TABLE_NAME,column_name,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH , Command
from t
where TABLE_NAME+column_name not in ( select TABLE_NAME+column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME like 'vw_%' or TABLE_NAME like 'tbl_%')
order by 1,2

我对表使用 alter 命令。我对所有 View 使用“vw_”,对所有表使用“tbl_tablename”。如果您没有此模型,您可以删除上述查询的一些代码。

希望有人将这个 SQL 数据库解决方案升级到 mysql。

关于mysql - 具有 90% 相同列的两个不同表的最佳设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59007639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com