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 ...
随机推荐
- 关于SQL Server数据库中的用户权限和角色管理
简介 在SQL Server数据库系统中,管理用户权限和角色对于确保数据安全.完整性和可访问性至关重要.在本文中,我们将探讨在SQL Server数据库中创建用户.分配权限和管理角色的过程.我们将涵盖 ...
- 如何使用LOTO示波器 绘制 频率响应特性曲线?
在工作和项目中,经常会遇到一个功能电路模块对信号进行调理,或滤波,或放大,或衰减,或阻抗变换.这些功能电路模块可能是无源阻容的,也可能是有源的运放电路,也可能是更复杂的系统.但是它们对信号进行调理的最 ...
- table边框改为细线
默认的TABLE边线设置即使是1px 是很粗的,会使用其他一些方法来制作出细线边框. 利用CSS来实现细线的方法,很有效,而且兼容所有浏览器. 细线表格如果单纯设置边框,很难保证浏览器兼容.常见的做法 ...
- C++代码实现OnComponentHit事件粒子消失蓝图--斯坦福
蓝图节点 OnComponentBeginOverlap,OnComponentHit等等之类如何迁移到C++中 方法 这些蓝图节点实际上就是一个UE4已经定义好的事件,在蓝图中使用模块的连接来实现事 ...
- Mybatis-Plus框架的BaseMapper的insert方法和自定义mapper里面的insert方法会用哪个
在Mybatis-Plus框架中,当一个接口继承了BaseMapper接口,并且绑定了一个xml文件时,如果这个接口和xml文件中都定义了相同的方法,那么在调用该方法时,会优先调用xml文件中的方法, ...
- 微服务集成Spring Cloud Zipkin实现链路追踪并集成Dubbo
1.什么是ZipKin Zipkin 是一个根据 Google 发表的论文" Dapper" 进行开源实现的分布式跟踪系统. Dapper是Google 公司内部的分布式追踪系统, ...
- Python 集合(Sets)2
访问项 您无法通过引用索引或键来访问集合中的项.但是,您可以使用for循环遍历集合项,或者使用in关键字检查集合中是否存在指定的值. 示例,遍历集合并打印值: thisset = {"app ...
- Qt调用摄像头一,基础版
本示例,为纯Qt调用摄像头,功能比较简单,打开摄像头,设置参数,拍照 涉及到的功能有: 获取摄像头列表 获取摄像头分辨率 获取摄像头帧率 获取摄像头支持的视频模式 设置摄像头参数 拍照 此版本的缺点是 ...
- CTFshow Reverse 逆向4 学习记录
题目 分析过程 是一个无壳,64位的文件 丢到IDA里面,找到main函数 1 int __cdecl __noreturn main(int argc, const char **argv, con ...
- 墨水污染的一角qsnctfwp
题目附件 在图片中最直接的信息是电话号码,将号码输入到搜索引擎,可以得到该书的出版社为:高等教育出版社. 进入高等教育出版社官网 根据物料号前四位.版次时间.印次时间,在官网中进行图书查询. 结合字数 ...