热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

列的数量和顺序都不固定,怎样建表比较好?

如下示例,在用户界面上,让用户可以自定义添加列,自己管理列的顺序,自己进行数据的增删改查。这些数据都要保存到数据库,所以具体有多少个列、列名称、顺序都是不确定的。这种情况如何创建一个通用的表来
如下示例,在用户界面上,让用户可以自定义添加列,自己管理列的顺序,自己进行数据的增删改查。

这些数据都要保存到数据库,所以具体有多少个列、列名称、顺序都是不确定的。
这种情况如何创建一个通用的表来管理数据?

7 个解决方案

#1


id userid colname values
1  1 性别 男,女
2  1 姓名 张三,李四
或者
id colname
1 性别
2 姓名

userid colid value
1 1 男
2 1 女
1 2 张三
2 2 李四

#2


以最多的列来设计  数据表。如果有数据就都存在里面。
比如性别,姓名,身高,年龄,体重等。
再设立一个配置表,存放客户定义了列的信息。比如
Uid   列
1     性别,姓名   
在程序里面,如果打开界面前,先查询出来列的信息,显示在前面上,以供编辑。然后根据这些列去更新数据表.

#3


USE tempdb
GO
IF OBJECT_ID('userInfo') IS NOT NULL DROP TABLE userInfo
GO
create table userInfo(
    userId int identity(1,1) primary key,
    userName nvarchar(20) not null,   --姓名 必填
    birthday datetime not null,          --生日,避免年龄总是变化
    age as datediff(year, birthday, getdate()),  --自动产生年龄
    gender nchar(1),          --性别
    c1 nvarchar(max),   --自定义列
    c2 nvarchar(max),   --自定义列
    c3 nvarchar(max),   --自定义列
    c4 nvarchar(max),   --自定义列
    c5 nvarchar(max),   --自定义列
    c6 nvarchar(max),   --自定义列
    c7 nvarchar(max),   --自定义列
    c8 nvarchar(max),   --自定义列
    c9 nvarchar(max),   --自定义列
    c10 nvarchar(max)   --自定义列
)
GO
IF OBJECT_ID('userInfoConfig') IS NOT NULL DROP TABLE userInfoConfig
GO
create table userInfoConfig(
    configId int identity(1,1)  primary key,
    colName varchar(50),
    colCustomeName   nvarchar(50),
    colSeq    int
)
GO


SET NOCOUNT ON
insert into userInfoConfig (colName,colCustomeName,colSeq)
              select 'userName','姓名',2
union all select 'age','年龄',5
union all select 'gender','性别',1
union all select 'c1','身高',3
union all select 'c2','体重',4

DECLARE @sql NVARCHAR(MAX)
SET @sql ='SELECT ' + STUFF(
(SELECT  ',[' + colName + '] AS [' + colCustomeName+']' 
FROM userInfoConfig ORDER BY colSeq
FOR XML PATH(''))
,1,1,'') + ' FROM dbo.userInfo'

PRINT @sql
EXEC (@sql)
/*
SELECT [gender] AS [性别],[userName] AS [姓名],[c1] AS [身高],[c2] AS [体重],[age] AS [年龄] FROM dbo.userInfo
性别   姓名    身高  体重  年龄                                                                                                                                                                                                                                  ---- -------- ------ ----- -----
*/

不明白现在为什么无法贴长的代码了, 只好分了两段

#4


在网站(或其它界面)设置每个列的顺序、名称等并保存, 后面要查询时, 组合一下动态SQL就好。

#5


引用 4 楼 yenange 的回复:
在网站(或其它界面)设置每个列的顺序、名称等并保存, 后面要查询时, 组合一下动态SQL就好。

谢谢,还有个问题,目前数据库用户成员身份是db_denydatareader、db_denydatawriter,所有操作都是调用存储过程,在存储过程内实现对表的增删改查。
在存储过程中使用“EXEC (@sql)”时会出现“拒绝了对对象[userInfo]的SELECT权限”,请教一下这个问题该怎么解决呢?
如果放开SELECT权限,我担心用户知道了数据库连接字符串就可以对表随便查询了。

附:http://bbs.csdn.net/topics/391055407

#6


引用 5 楼 hironpan 的回复:
Quote: 引用 4 楼 yenange 的回复:

在网站(或其它界面)设置每个列的顺序、名称等并保存, 后面要查询时, 组合一下动态SQL就好。

谢谢,还有个问题,目前数据库用户成员身份是db_denydatareader、db_denydatawriter,所有操作都是调用存储过程,在存储过程内实现对表的增删改查。
在存储过程中使用“EXEC (@sql)”时会出现“拒绝了对对象[userInfo]的SELECT权限”,请教一下这个问题该怎么解决呢?
如果放开SELECT权限,我担心用户知道了数据库连接字符串就可以对表随便查询了。

附:http://bbs.csdn.net/topics/391055407

单独加这两个表的 select 权限呢?

#7


几种方法:

1. 动态添加属性字段。(不肯能,DDL影响很大)
2. 先预留字段,到时再用。(浪费很多空间,IO开销大,有限)
3. 使用 XML 字段保存。(非主流,XML读取麻烦)
4. JSON 格式保存。(可行,子文档存储自定义字段)
5. 属性字段行存储(设计复杂,省、无限扩展)


以前粗略写的,请参考: 数据库字段动态扩展设计

推荐阅读
  • mysql数据库json类型数据,sql server json数据类型
    mysql数据库json类型数据,sql server json数据类型 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • 本文详细探讨了BCTF竞赛中窃密木马题目的解题策略,重点分析了该题目在漏洞挖掘与利用方面的技巧。 ... [详细]
  • 数据类型和操作数据表2.1MySQL类型之整型2.2MySQL数据类型之浮点型2.3日期时间型DATE1支持时间:1000年1月1日~9999年12月31日DATETIME ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • 在将Excel数据导入MySQL数据库的过程中,如何确保不会生成重复记录?本文介绍了一种方法,通过PHP脚本检查数据库中是否存在相同的“Code”字段值,从而避免重复记录的产生。该方法不仅提高了数据导入的准确性,还增强了系统的健壮性。 ... [详细]
  • 在MySQL中实现时间比较功能的详细解析与应用
    在MySQL中实现时间比较功能的详细解析与应用。本文深入探讨了MySQL中时间比较的实现方法,重点介绍了`UNIX_TIMESTAMP`函数的应用。该函数可以接收一个日期时间参数,也可以不带参数使用,其返回值为Unix时间戳,便于进行时间的精确比较和计算。此外,文章还涵盖了其他相关的时间处理函数和技巧,帮助读者更好地理解和掌握MySQL中的时间操作。 ... [详细]
  • 拖拉切割直线 ... [详细]
  • 本文详细介绍如何在Spring Boot项目中集成和使用JPA,涵盖JPA的基本概念、Spring Data JPA的功能以及具体的操作步骤,帮助开发者快速掌握这一强大的持久化技术。 ... [详细]
  • 本文探讨了如何有效地构建和优化微信公众平台账号,涵盖了用户信息管理、内容创作与发布、互动策略及数据分析等方面。通过合理设置用户信息字段,如用户名、昵称、密码、真实姓名和性别等,确保账号的安全性和用户体验。同时,文章还介绍了如何利用微信公众平台的各项功能,提升用户参与度和品牌影响力。 ... [详细]
  • 如何在MySQL中选择合适的表空间以优化性能和管理效率
    在MySQL中,合理选择表空间对于提升表的管理和访问性能至关重要。表空间作为MySQL中用于组织和管理数据的一种机制,能够显著影响数据库的运行效率和维护便利性。通过科学地配置和使用表空间,可以优化存储结构,提高查询速度,简化数据管理流程,从而全面提升系统的整体性能。 ... [详细]
  • 在C#中开发MP3播放器时,我正在考虑如何高效存储元数据以便快速检索。选择合适的数据结构,如字典或数组,对于优化性能至关重要。字典能够提供快速的键值对查找,而数组则在连续存储和遍历方面表现优异。根据具体需求,合理选择数据结构将显著提升应用的响应速度和用户体验。 ... [详细]
  • 1.3.4ProfilerSQLServerProfiler是一个图形化的管理工具用于监督记录和检查SQLServer数据库的使用情况对系统管理员来说它是一个监视用户活动的间谍1. ... [详细]
  • 定制数据层关键字:数据层,访问,元数据,数据访问模型http://www.gaodaima.com/35448.html定制数据层_sqlserver ... [详细]
author-avatar
清潇静凌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有