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 ...
随机推荐
- drools中使用function
一.背景 当我们在drools中编写规则时,有些时候存在重复的代码,那么我们是否可以将这些重复代码抽取出来,封装成一个function来调用呢?那么在drools中如何自定义function? 二.需 ...
- 参数 ora_input_emptystr_isnull 对于数据存储的影响
原生的PG 对于 '' 和 null 认为是不同值:空值 和不确定值:而oracle 认为二者都是不确定的值.KingbaseES 为了兼容Oracle,增加了参数ora_input_emptystr ...
- #折半搜索,状压dp#nssl 1471 Y
分析 设\(dp[i][j][s]\)表示从\(i\)到\(j\)的一条路径状态为\(s\)是否存在 但是这样肯定会T掉,考虑拼凑路径,分成两部分, 设\(dp[0/1][s]\)分别表示以某个起点/ ...
- #组合计数,全排列#洛谷 2518 [HAOI2010]计数
题目 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数. 比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. ...
- #博弈论#Poj 1740 A New Stone Game
题目 两个人轮流操作,每次选择一个非空石堆后, 选择扔掉至少一个石子后可将剩余石子任意移动至其余非空石堆, 也可以不移,无石子可取者为败,问先手是否必胜 分析 感性理解一下,如果有两堆个数相同的石子, ...
- 【福利活动】深度体验OpenHarmony对接华为云IoT
本文主要介绍基于OpenHarmony 3.0来接入IoTDA,以BearPi-HM_Nano开发板为例,使用huaweicloud_iot_link SDK对接华为云物联网平台的简单流程.文末为 ...
- C# Dictionary(数据字典)的基本用法
C# Dictionary(数据字典)的基本用法 - Mr.Cat~ - 博客园 (cnblogs.com) 通常情况下,我们可以通过 int 类型的索引来从数组或者 List 集合中查询所需的数 ...
- Redis 19 SpringBoot集成
概述 SpringBoot 整合 Redis 是使用 SpringData 实现的. SpringData 是与 SpringBoot 齐名的顶级项目,整合了对常用数据库的模板型操作. 在 Sprin ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit
1.问题描述 在App中供用户在地图上选择地址,目前在使用Map Kit结合geolocationManager逆地理编码时获取的地址信息描述不准确,希望能提供相应的Demo参考. 解决方案 Demo ...
- HMS Core电商解决方案之商品3D商品展示
传统电商商品展示采用图文结合的形式,文案介绍产品的相关参数,搭配精美图片去吸引客户眼球.但图文商品展示由于色差.尺寸不符等原因,会让消费者产生图片和实物不一致的疑虑,且消费者需要消耗大量精力阅读和比较 ...