Mysql 针对两个不同表的最佳设计,具有90%的相同列

Mysql 针对两个不同表的最佳设计,具有90%的相同列,mysql,sql,database,design-patterns,database-design,Mysql,Sql,Database,Design Patterns,Database Design,我有一个feature\u 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

我有一个
feature\u 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\u feature\u值中。这样他们就可以用自己的值编辑表中的默认值。稍后,他们可以选择默认值;从
default\u feature\u values
表复制到
user\u feature\u values

这是一个糟糕的设计吗


这可以实现得多好?

您可以将此解决方案用于SQL server,但我想这种方法只要稍作修改,就可以很好地用于mysql(我对mysql一无所知):

步骤1:创建类似此查询的链接服务器(或在对象资源管理器中以其他方式设置):

步骤2:将信息_schema.columns用于compare和alter命令,如下所示:

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命令。 我对所有视图使用“vw_”,对所有表使用“tbl_tablename”。如果您没有这个模型,您可以删除上面查询的一些代码


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

#
作为第一个字符命名表似乎是一个糟糕的选择(尽管我无法解释为什么我会有这种偏见)。也就是说,我不知道这个问题在问什么。它是在征求对设计的意见吗?还是在寻求实现功能的方法。第一种建议是出于一个原因而关闭;第二个是另一个。@GordonLinoff不,我没有这样给他们命名。我只是用
#
来区分表和实际的特性值来解释这个场景。我正在征求对设计的意见,以及这是否可以以更好的方式实现。“基于观点”是结束一个问题的第五个结束理由(我假设你知道,基于你的观点)。你可以用不同的方式表达类似的问题——例如,基于性能。我想说,这种设计有一个缺口——用户可能想“记住”他们的价值观,然后回到他们身边,但你的设计不支持这一点,,,首先,看看数据的外观和您所说的,我很可能会选择一个表
feature\u values
(带有默认列值)和一个
feature\u values\u权限
表,该表带有
feature\u values
id,用户可以编辑,哪些不可以…用户可以在多个国家/地区?当然,
user…
表不需要一个
country
列吗?这个网站上的SQL标记不是针对SQL Server SQL方言的,它是针对有效的ANSI/ISO结构化查询语言(SQL)规范语言代码的,同样,当MySQL标记被标记时,答案应该具有MySQL有效语法。。。提供的代码不会在MySQL上运行。。
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