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 ...
随机推荐
- ZYNQ7000系列学习之自定义模块构成IP
ZYNQ的自定义IP 1.实验原理 在vivado中可以将自己写的verilog模块封装成IP核,并入bd设计,有效地提高了PS到PL的设计内联能力.同时,这部分的学习可以将verilog的基础知识转 ...
- KingbaseES Json 系列七:Json记录操作函数二
KingbaseES Json 系列七--Json记录操作函数二(JSONB_POPULATE_RECORD,JSONB_POPULATE_RECORDSET,JSON_POPULATE_RECORD ...
- P图神器Lama下载介绍,一键移除图片中任何不想要的元素
Lama是一个完全自托管的图像处理工具,基于最前沿的AIGC模型,它可以从图片中删除任何不需要的物体.缺陷或对象,却看不到一点修改痕迹~ 在以前,我们想将图片中的文字.水印去除,可以使用ps,但ps的 ...
- GraphPro
GraphPro: Graph Pre-training and Prompt Learning for Recommendation 北京B区 / 032机 北京B区 / 224机 数据集介绍 本文 ...
- #轮廓线dp,模型转换#洛谷 3226 [HNOI2012]集合选数
题目 问有多少个集合 \(S\) 是 \([1,n]\) 的子集, 并且 \(\forall a,b\in S,a|b\),满足 \(\frac{b}{a}\neq \{2,3\}\) 分析 可以发现 ...
- #Pollard-Rho,高精度#洛谷 3499 [POI2010]NAJ-Divine Divisor
题目 给定\(m\)个数\(a_i\),令\(n=\prod_{i=1}^m a_i\), 问有多少个大于1的正整数\(d\)满足\(d^{\max k}|n\) 并输出\(\max k\),\(m\ ...
- Android Graphics 多屏同显/异显 - C++示例程序(标准版)
"为了理解Android多屏同显/异显的基本原理,我们将从Native Level入手,基于Graphics APIs写作一个简单的C++版本的多屏显示互动的演示程序.通过这个程序我们将了解 ...
- iOS系统崩溃的捕获
iOS系统崩溃的捕获 相信大家在开发iOS程序的时候肯定写过各种Bug,而其中最为严重的Bug就是会导致崩溃的Bug(一般来说妥妥的P1级).在应用软件大大小小的各种异常中,崩溃确实是最让人难以接受的 ...
- 重新点亮linux 基本软件————防火墙[一]
前言 简单介绍一下linux的防火墙. 正文 防火墙分类: 软件防火墙和硬件防火墙 包过:过滤防火墙和应用层防火墙 iptables 的表和链 规则表: filter nat mangle raw f ...
- 整理k8s————k8s prod相关[三]
前言 简单整理k8s prod. 正文 prod 有两种: 自主式prod 控制器管理的prod 在Kubernetes中,最小的管理元素不是一个个独立的容器,而是Pod,Pod是最小的,管理,创建, ...