日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库分表设计-任我行

發布時間:2023/12/29 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库分表设计-任我行 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文只闡述一個完整的實例,直接可以復制過去用,不作過多的解釋。

簡單說一下分表與分區:

分區的原理:我在深圳市,但我也在中國,如果中國沒有劃分區域的話,搜索范圍將是整個中國,查詢起來很費力。現在既然中國已經劃分區域當然可以直接來深圳市找我了,是不是快了很多。

分表的原理:我在中國,通過某種算法(比如查戶口)知道了我在深圳,是不是也可以直接來深圳市找我,其他區域就不用去看了,本文的算法為dbo.GetTableName(),通過這個算法知道了數據存儲在哪張表里面。

--用于保存所有日志ID,與操作項的Id,在操作日志的時候, --可以依據此表來獲取最后一次日志插入的ID,依據此ID來決定插入日志子表 CREATE TABLE LogId (Id INT IDENTITY(1,1) PRIMARY KEY,ItemId int )GO--創建日志表,共創建8張表 CREATE TABLE Logs_0 (LogId INT PRIMARY KEY,LogType NVARCHAR(100),--日志類型Operator NVARCHAR(100),--操作者ItemId INT,--操作項主鍵[Description] NVARCHAR(2000),--操作描述OperateDate DATETIME,--操作日期OperateIP NVARCHAR(50)--操作IP ) GO CREATE TABLE Logs_1 (LogId INT PRIMARY KEY,LogType NVARCHAR(100),--日志類型Operator NVARCHAR(100),--操作者ItemId INT,--操作項主鍵[Description] NVARCHAR(2000),--操作描述OperateDate DATETIME,--操作日期OperateIP NVARCHAR(50)--操作IP ) GO CREATE TABLE Logs_2 (LogId INT PRIMARY KEY,LogType NVARCHAR(100),--日志類型Operator NVARCHAR(100),--操作者ItemId INT,--操作項主鍵[Description] NVARCHAR(2000),--操作描述OperateDate DATETIME,--操作日期OperateIP NVARCHAR(50)--操作IP ) GO CREATE TABLE Logs_3 (LogId INT PRIMARY KEY,LogType NVARCHAR(100),--日志類型Operator NVARCHAR(100),--操作者ItemId INT,--操作項主鍵[Description] NVARCHAR(2000),--操作描述OperateDate DATETIME,--操作日期OperateIP NVARCHAR(50)--操作IP ) GO CREATE TABLE Logs_4 (LogId INT PRIMARY KEY,LogType NVARCHAR(100),--日志類型Operator NVARCHAR(100),--操作者ItemId INT,--操作項主鍵[Description] NVARCHAR(2000),--操作描述OperateDate DATETIME,--操作日期OperateIP NVARCHAR(50)--操作IP ) GO CREATE TABLE Logs_5 (LogId INT PRIMARY KEY,LogType NVARCHAR(100),--日志類型Operator NVARCHAR(100),--操作者ItemId INT,--操作項主鍵[Description] NVARCHAR(2000),--操作描述OperateDate DATETIME,--操作日期OperateIP NVARCHAR(50)--操作IP ) GO CREATE TABLE Logs_6 (LogId INT PRIMARY KEY,LogType NVARCHAR(100),--日志類型Operator NVARCHAR(100),--操作者ItemId INT,--操作項主鍵[Description] NVARCHAR(2000),--操作描述OperateDate DATETIME,--操作日期OperateIP NVARCHAR(50)--操作IP ) GO CREATE TABLE Logs_7 (LogId INT PRIMARY KEY,LogType NVARCHAR(100),--日志類型Operator NVARCHAR(100),--操作者ItemId INT,--操作項主鍵[Description] NVARCHAR(2000),--操作描述OperateDate DATETIME,--操作日期OperateIP NVARCHAR(50)--操作IP ) GO CREATE TABLE Logs_8 (LogId INT PRIMARY KEY,LogType NVARCHAR(100),--日志類型Operator NVARCHAR(100),--操作者ItemId INT,--操作項主鍵[Description] NVARCHAR(2000),--操作描述OperateDate DATETIME,--操作日期OperateIP NVARCHAR(50)--操作IP );GO --創建視圖,關聯起所有的日志子表,查詢時直接操作此視圖 CREATE VIEW Logs ASSELECT * FROM dbo.Logs_0 UNION ALLSELECT * FROM dbo.Logs_1 UNION ALLSELECT * FROM dbo.Logs_2 UNION ALLSELECT * FROM dbo.Logs_3 UNION ALLSELECT * FROM dbo.Logs_4 UNION ALLSELECT * FROM dbo.Logs_5 UNION ALLSELECT * FROM dbo.Logs_6 UNION ALLSELECT * FROM dbo.Logs_7 UNION ALLSELECT * FROM dbo.Logs_8 GO --根據dbo.LogId最后一次插入的Id值來確定到底需要插入到哪張日志子表,并返回表名 CREATE FUNCTION [dbo].[GetTableName]( @Id INT, @table NVARCHAR(50)='Logs') RETURNS NVARCHAR(60) AS BEGINDECLARE @tablename NVARCHAR(60)DECLARE @tableId INT, @delimiter INTSET @delimiter = 20000 --注意,一旦定下,不可再修改,因項目而異,可以更大小,建議不要超過50WSET @tableId = FLOOR(@Id/@delimiter) SET @tablename = 'dbo.' + @table + '_' + CAST(@tableId AS nvarchar)RETURN @tablenameRETURN ''; END GO --添加日志 CREATE PROC [dbo].[LogAdd] @logid int, @logtype nvarchar(100), @operator nvarchar(100), @itemid int, @description nvarchar(2000), @operatedate datetime, @operateip nvarchar(50)asdeclare @tablename nvarchar(100) = 'Logs',@sql nvarchar(1000) = ''insert LogId(ItemId)values(@itemid)set @logid = @@IDENTITYset @tablename = dbo.GetTableName(@logid, 'Logs')set @sql=N'insert '+@tablename+'(LogId,LogType,[Operator],ItemId,[Description],OperateDate,OperateIP)values(@logid,@logtype,@operator,@itemid,@description,@operatedate,@operateip);SELECT @@IDENTITY'exec sp_executesql @sql,N'@logid int,@logtype nvarchar(100),@operator nvarchar(100),@itemid int,@description nvarchar(2000),@operatedate datetime,@operateip nvarchar(50)',@logid=@logid,@logtype=@logtype,@operator=@operator,@itemid=@itemid,@description=@description,@operatedate=@operatedate,@operateip=@operateip GO --修改日志 CREATE PROC [dbo].[LogUpdate] @logid int, @logtype nvarchar(100), @operator nvarchar(100), @itemid int, @description nvarchar(2000), @operatedate datetime, @operateip nvarchar(50) asdeclare @tablename nvarchar(100)='Logs',@sql nvarchar(1000)=''set @tablename=dbo.GetTableName(@logid,'Logs')set @sql=N'update '+@tablename+' set LogType,[Operator],[Description],OperateDate,OperateIP where LogId=@logid;SELECT @@IDENTITY'exec sp_executesql @sql,N'@logid int,@logtype nvarchar(100),@operator nvarchar(100),@itemid int,@description nvarchar(2000),@operatedate datetime,@operateip nvarchar(50)',@logid=@logid,@logtype=@logtype,@operator=@operator,@itemid=@itemid,@description=@description,@operatedate=@operatedate,@operateip=@operateipGO --刪除日志 CREATE PROC [dbo].[LogDelete] @logid int AS BEGINdeclare @tablename nvarchar(100)='Logs',@sql nvarchar(1000)=''set @tablename=dbo.GetTableName(@logid,'Logs');set @sql=N'delete '+@tablename + ' where LogId='+@logid;exec(@sql); END GO --得到日志查詢的總記錄數 CREATE PROC [dbo].[LogSearchCount] @condition NVARCHAR(1000) ASdeclare @sql nvarchar(2000)=''set @sql = 'select count(0) from Logs where 1=1 '+@conditionexec(@sql); GO --查詢日志,直接操作Logs視圖 CREATE PROC [dbo].[LogSearch] @begin NVARCHAR(10), @end NVARCHAR(10), @condition NVARCHAR(1000) AS declare @sql nvarchar(2000)=''set @sql =N'SELECT * FROM (SELECT ROW_NUMBER()OVER(ORDER BY LogId) line,* FROM Logs WHERE 1=1 '+@condition+' )A WHERE A.line>'+@begin+' AND A.line<='+@end;

?

轉載于:https://www.cnblogs.com/xuyubing/p/3822713.html

總結

以上是生活随笔為你收集整理的数据库分表设计-任我行的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。