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 ...
随机推荐
- Android---ListView控件用法
首先要使用ListView是要自定义一个适配器类的,先简单分析一下适配器怎么写: 示例程序是要使用ListView列表显示出水果的图片以及对应的水果文字描述(水果名字). public class F ...
- Vue入门笔记三(Vuex)
<Vue.js项目实战> Vuex 集中式的状态管理 Vuex从Flux(由Facebook开发)的概念中获取得灵感.Flux又一系列指导原则构成,阐明了如何使用集中式store来实现组件 ...
- #ST表#CF1879F Last Man Standing
洛谷题面 CF1879F 分析 当 \(x\) 大于最大值时一定可以被约化为等于的情况,考虑枚举 \(x\), 通过枚举倍数的方式可以知道存在若干段区间消耗同一精神状态的次数是相同的,那么区别就是其精 ...
- #ST表,单调栈#洛谷 5648 Mivik的神力
题目 分析 考虑答案应该是一段单调不下降的序列, 考虑预处理出每个点往后第一个大于这个点的位置, 那么答案应该是左端点到区间内最大的位置以及这个位置到右端点的贡献 那么区间最大的位置可以用ST表做,然 ...
- Response下载文件
Response下载文件的主要步骤有七个: 1.要获取下载文件的路径 String realPath = "F:\\JavaWeb\\WorkSpace\\JavaWeb-Servlet\\ ...
- HarmonyOS课程尝鲜计划,优享特权大礼包
报名入口:https://developer.huawei.com/consumer/cn/activity/901689042385499023
- 服务器日志qsnctfwp
使用 WireShark 打开日志文件 log.pcpng 获取恶意用户下载的文件 方法一:通过对 FTP-DATA 对象导出,可知下载了名为 flag 的文件,通过 save 可获取文件 方法二:通 ...
- redis 简单整理——内存的优化[二十七]
前言 简单介绍一下内存的优化. 正文 Redis所有的数据都在内存中,而内存又是非常宝贵的资源.如何优化内存的使用一直是Redis用户非常关注的问题.本节深入到Redis细节中,探索内存优化的技巧. ...
- jenkins 持续集成和交付——开篇(一)
前言 因为以前就很想看下jenkins了,平时工作中也使用,主要是写脚本,但是jenkins 主要还是说运维部门来搞定的,因为公司安全部门认为程序员不应该去接触运维的东西,但是上次面试问了下,准备把这 ...
- 利用PyTorch训练模型识别数字+英文图片验证码
利用PyTorch训练模型识别数字+英文图片验证码 摘要:使用深度学习框架PyTorch来训练模型去识别4-6位数字+字母混合图片验证码(我们可以使用第三方库captcha生成这种图片验证码或者自己收 ...