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