SQL server 表字段扩展设计
一、扩展字段表
一个表的字段可能并非一成不变,系统的运行、需求的变化等客观条件可能会需要增加其他字段,如何在不直接修改表设计的前提下满足需求呢?该扩展字段表的思想就是将列设计转化为行设计,字段的增加表现为记录的增加。当然这种方式也不是万能的,对于需要排序、查询和索引的字段最好还是通过添加表字段的方式增加。
字段名称 | 数据类型 | 属性 | 允许空 | 默认值 | 备注 |
ext_id | int (4) | PK AI | 扩展字段编号 | ||
ext_guid | char (36) | newid() | 扩展字段GUID | ||
ext_table | varchar (50) | '' | 扩展字段关联表名 | ||
ext_code | varchar (50) | '' | 扩展字段编码 | ||
ext_name | nvarchar (100) | '' | 扩展字段名称 | ||
ext_desc | nvarchar (200) | '' | 扩展字段描述 | ||
ext_order | int (4) | 0 | 扩展字段序号 | ||
ext_necessary | int (4) | 0 | 扩展字段是否必需 | ||
ext_data_len | int (4) | 0 | 扩展字段数据长度 | ||
ext_data_type | varchar (50) | '' | 扩展字段数据类型 | ||
ext_form_type | varchar (50) | '' | 扩展字段表单类型 | ||
ext_form_url | varchar (300) | '' | 扩展字段数据来源URL | ||
ext_data_regex | varchar (100) | '' | 扩展字段正则表达式 | ||
ext_data_tip | varchar (100) | '' | 扩展字段提示 | ||
ext_state | int (4) | 1 | 扩展字段状态 |
表1:base_extension(扩展字段表)
二、扩展字段值表
上述方式实现的字段的动态增加,那字段的值该如何保存呢?当然通过另一个新表来存储。
字段名称 | 数据类型 | 属性 | 允许空 | 默认值 | 备注 |
prop_id | int (4) | PK AI | 属性编号 | ||
ext_code | varchar (36) | '' | 扩展字段编码 | ||
ext_guid | varchar (36) | '' | 扩展字段GUID(冗余) | ||
ext_table | varchar (50) | '' | 扩展字段表名(冗余) | ||
object_guid | varchar (36) | '' | 对象GUID | ||
prop_value | nvarchar (4000) | '' | 属性值 |
表2:base_property(扩展字段值表)
三、综述
比如一个商家表,设计之初已添加商家编号、商家GUID、商家名称、商家地址、商家电话等字段,后期又需要增加营业时间、所在区域、商家优惠说明等扩展字段,使用上述两个表可以提升系统的可扩展性和可配置性。
文章来源:https://blog.csdn.net/joeries/article/details/78657568
https://segmentfault.com/a/1190000020190093?utm_source=tag-newest
https://www.cnblogs.com/jpfss/p/8989191.html
方案一:版本号+通用列
以上面的用户表为例,假设只有uid和name上有查询需求,表可以设计为
user(uid, name, version, ext)
(1) uid和name有查询需求,必须设计为单独的列并建立索引
(2) version是版本号字段,它对ext进行了版本解释
(3) ext采用可扩展的字符串协议载体,承载被查询的属性
例如,最开始上线的时候, 版本为0,此时只有passwd和nick两个属性,那么数据为:
当产品经理需要扩展属性时, 新数据将版本变为1,
此时新增了age和sex两个数据,数据变为:
优点:
(1)可以随时动态扩展属性
(2)新旧两种数据可以同时存在
(3) 迁移数据方便,写个小程序将旧版本ext的改为新版本的ext,并修改version
不足:
(1) ext里的字段无法建立索引
(2) ext里的key值有大量冗余,建议key短一些
改进:
(1)如果ext里的属性有索引需求,可能Nosql的如MongoDB会更适合
|
方案二:通过扩展行的方式来扩展属性
以上面的用户表为例,可以设计为
user(uid, key, value)
初期有name, passwd, nick三个属性,那么数据为:
未来扩展了age和sex两个属性,数据变为:
优点:
(1)可以随时动态扩展属性
(2)新旧两种数据可以同时存在
(3) 迁移数据方便,写个小程序可以将新增的属性加上
(4) 各个属性上都可以查询
不足:
(1) key值有大量冗余,建议key短一些
(2) 本来一条记录很多属性,会变成多条记录,行数会增加很多
|
- 【统一帖子中心服务】
- 【统一类目属性服务】
- 【统一检索服务】
--用户字段
if exists (select * from sysobjects where id = OBJECT_ID('pro_sys_field') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE [pro_sys_field]
CREATE TABLE [pro_sys_field](
[fieldid] int identity(1,1) primary key,--字段id
[tablename] [varchar](255) NULL,--所属表名
[fieldname] [varchar](255) NULL,--字段名
[fieldremark] [varchar](255) NULL,--字段备注
[fieldtype] [varchar](255) NULL,--字段类型 1.输入框,2下拉,3单选,4多选
[fieldsort] int NULL,--字段排序
[isrequiredfield] int NULL,--1.必选字段
[fieldlength] [varchar](255) NULL,--字段长度
[isnumber] int NULL,--只有数字字段才能进行排序
)
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户字段' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_field'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字段编号' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_field', @level2type=N'COLUMN',@level2name=N'fieldid'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'所属表名' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_field', @level2type=N'COLUMN',@level2name=N'tablename'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字段名' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_field', @level2type=N'COLUMN',@level2name=N'fieldname'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字段备注' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_field', @level2type=N'COLUMN',@level2name=N'fieldremark'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字段类型' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_field', @level2type=N'COLUMN',@level2name=N'fieldtype'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字段排序' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_field', @level2type=N'COLUMN',@level2name=N'fieldsort'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'必选字段' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_field', @level2type=N'COLUMN',@level2name=N'isrequiredfield'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字段长度' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_field', @level2type=N'COLUMN',@level2name=N'fieldlength'
GO --用户字段选项
if exists (select * from sysobjects where id = OBJECT_ID('pro_sys_fieldoption') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE [pro_sys_fieldoption]
CREATE TABLE [pro_sys_fieldoption](
[optionid] int identity(1,1) primary key,--字段选项id
[fieldid] int NULL,--字段id
[optiontext] [varchar](255) NULL,--字段选项文字
[optionvalue] [varchar](255) NULL,--字段选中文字
[optionsort] int NULL,--字段选项排序
)
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户字段选项' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_fieldoption'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字段选项编号' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_fieldoption', @level2type=N'COLUMN',@level2name=N'optionid'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字段编号' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_fieldoption', @level2type=N'COLUMN',@level2name=N'fieldid'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'选项文字' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_fieldoption', @level2type=N'COLUMN',@level2name=N'optiontext'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'选中文字' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_fieldoption', @level2type=N'COLUMN',@level2name=N'optionvalue'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'选项排序' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_fieldoption', @level2type=N'COLUMN',@level2name=N'optionsort'
GO
--用户字段值
if exists (select * from sysobjects where id = OBJECT_ID('pro_sys_fieldvalue') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE [pro_sys_fieldvalue]
CREATE TABLE [pro_sys_fieldvalue](
[valueid] int identity(1,1) primary key,--字段值id
[fieldid] int NULL,--字段id
[valuetext] [varchar](255) NULL,--字段值
[postinformationid] [varchar](255) NULL,--发布信息id
)
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户字段值' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_fieldvalue'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字段值编号' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_fieldvalue', @level2type=N'COLUMN',@level2name=N'valueid'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字段编号' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_fieldvalue', @level2type=N'COLUMN',@level2name=N'fieldid'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字段值' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_fieldvalue', @level2type=N'COLUMN',@level2name=N'valuetext'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'发布信息编号' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'pro_sys_fieldvalue', @level2type=N'COLUMN',@level2name=N'postinformationid'
GO
SQL server 表字段扩展设计的更多相关文章
- SQL Server 表字段值转列名 示例
前几天,同事问我怎样把字段值转换成字段列,就写了一个最简单的Demo分享一下. 代码如下: -- 创建测试表以及添加测试数据create table #temp(a money,b varchar(1 ...
- SQL Server 表字段值转换成字段名称(二)
上次写了个比较简单的只有两个字段的例子,经要求在写个 3 个字段的示例 ,贴上来与大家共勉一下 如果你们有更好的方法,提供一下, 感激不尽. 示例如下: /*--drop table temp_ ...
- 修改sql server表字段的字符串
网站标题被注入黑链接,使用sql脚本update修改字段内的字符串截取UPDATE [qds0460132_db].[dbo].[Blood_News] SET [Blood_Name] = SU ...
- 获得、修改 SQL Server表字段说明
SELECT ( then d.name else '' end) 表名, a.colorder 字段序号, a.name 字段名, g.[value] AS 字段说明 FROM syscolumns ...
- SQL Server:OA权限管理设计的实现 下
SQL Server:OA权限管理设计的实现 下 OA系统权限管理设计方案 不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是最基本的功能. 可以对“组”进行权限 ...
- 如果正确读取SQL Server中的扩展事件?
SQL Server中使用扩展事件捕捉所需的信息后,可以选择存放的位置.比如说内存或文件中,但无论存在哪里,其本质都是一个大XML.因此在SQL Server中读取该XML就是解析扩展事件结果 ...
- SQL SERVER Buffer Pool扩展
Buffer Pool扩展简介 Buffer Pool扩展是buffer pool 和非易失的SSD硬盘做连接.以SSD硬盘的特点来提高随机读性能. 在Buffer Pool 扩展之前,SQL Ser ...
- sql server 常用的扩展存储过程
sql server 里面提供了丰富的系统存储过程来辅助我们管理数据库以及开发.今天分享介绍一些常用的数据库扩展存储过程 xp_cmdshell 这个大家都比较熟悉了,使用xp_cmdshell 可以 ...
- SQL SERVER中的扩展属性
以前在SQL SERVER建表时,总看到扩展属性,但一直未使用过.今天研究下: 增加扩展属性: 语法: sp_addextendedproperty [ @name = ] { 'property_n ...
- SQL Server中的扩展事件学习系列
SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events SQL Server 扩展事件(Extented Event ...
随机推荐
- Redis(5)——亿级数据过滤和布隆过滤器
一.布隆过滤器简介 上一次 我们学会了使用 HyperLogLog 来对大数据进行一个估算,它非常有价值,可以解决很多精确度不高的统计需求.但是如果我们想知道某一个值是不是已经在 HyperLogLo ...
- 主nginx和子nginx-------域名-端口-解答
主nginx和子nginx-------域名-端口-解答 想象一下Nginx是一个接待员,每个端口就像接待员的一个电话线,而server_name就像是客户拨打的不同号码. 当你在Nginx配置文件里 ...
- Anaconda使用教程
0 写在前面 以下命令都是在命令行模式下进行操作,macOS和Linux用户可以直接打开Terminal终端,Windows用户如果配置了环境变量则可以直接打开cmd,否则需要打开Anaconda P ...
- HarmonyOS SDK,助力开发者打造焕然一新的鸿蒙原生应用
鸿蒙生态千帆启航仪式于 1 月 18 日正式启动.从 2019 年 HarmonyOS 正式发布到 2020 年"没有人能够熄灭漫天星光",今天,满天星光终汇成璀璨星河,Harmo ...
- UML 哲学之道——启航篇[一]
前言 简单去介绍一下uml的哲学之道也是自我整理之道. 正文 什么是uml,全程是统一建模语言(unified modeling language),简单的说就是用图形来表示文档. 是描述构造和文档化 ...
- 使用Elasticsearch做手机号和身份证号的模糊检索
使用Elasticsearch做手机号和身份证号的模糊检索 背景 客户想通过人名 四位数值 来检索人的信息 例如 张三 3421,例如需要检索包含张三和且手机号或者身份证里包含3421的数据 过程 e ...
- InnoDB常用锁总结(行锁、间隙锁、临键锁、表锁)
相关文章 数据库系列:MySQL慢查询分析和性能优化 数据库系列:MySQL索引优化总结(综合版) 数据库系列:高并发下的数据字段变更 数据库系列:覆盖索引和规避回表 数据库系列:数据库高可用及无损扩 ...
- react中引入css的方式有哪几种?区别?
一.是什么 组件式开发选择合适的css解决方案尤为重要 通常会遵循以下规则: 可以编写局部css,不会随意污染其他组件内的原生: 可以编写动态的css,可以获取当前组件的一些状态,根据状态的变化生成不 ...
- 实际项目中一般使用到的git知识
1.项目上线分支管理流程 图片压缩太厉害有些模糊 700k 压缩到20多k 清晰些的图片地址https://project.zdzspace.cn/test-vuekey 2.一些常用的git命令 g ...
- 【Oracle】对一个已经拥有重复数据的表的列设置唯一性约束
对一个已经拥有重复数据的表的列设置唯一性约束 在这种情况下创建唯一性约束,可以发现会报错,通常为由于存在重复的键值,无法生效唯一性约束 最简单的方法,就是删除重复的记录,这样就可以按照正常流程,创建唯 ...