高访问量的评论系统数据库存储过程架构
网站的评论信息是最耗资源的地方,做好评论数据的优化对大型站点来说至关重要 无 SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[CommentsTables]([ID] [int] IDENTITY(1,1) NOT NULL,[Key] [nvarchar](50) NOT NULL,[TableName] [nvarch
网站的评论信息是最耗资源的地方,做好评论数据的优化对大型站点来说至关重要SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[CommentsTables]( [ID] [int] IDENTITY(1,1) NOT NULL, [Key] [nvarchar](50) NOT NULL, [TableName] [nvarchar](80) NOT NULL, [StartID] [int] NOT NULL, [EndID] [int] NOT NULL, CONSTRAINT [PK_SysTables] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO --根据SourceID和key获得表名 create function [dbo].[funGetTableName] ( @SourceID int, @Key nvarchar(50) ) RETURNS nvarchar(80) as begin declare @tableName nvarchar(80); declare @tableArea int; declare @mod int; declare @Size int; set @Size = 1000; set @mod = @SourceID % @Size; if @mod > 0 set @tableArea = Cast((@SourceID-1) / @Size as int) + 1; else set @tableArea = Cast((@SourceID-1) / @Size as int); set @tableName = 'comments_' + @Key + Cast(@tableArea as nvarchar(10)); return @tableName end GO --评论写入调用存储过程 CREATE proc [dbo].[procAddComment] ( @ParentID int, @SourceID int, @NickName nvarchar(20), @Content nvarchar(300), @IP nvarchar(30), @City nvarchar(30), @BeFiltered bit, @Disable bit, @Key nvarchar(50), @InsertedID int Output ) as begin declare @tableName nvarchar(80); declare @tableArea int; declare @mod int; declare @Size int; set @Size = 1000; set @mod = @SourceID % @Size; if @mod > 0 set @tableArea = Cast((@SourceID-1) / @Size as int) + 1; else set @tableArea = Cast((@SourceID-1) / @Size as int); set @tableName = 'comments_' + @Key + Cast(@tableArea as nvarchar(10)); if not Exists(select 'x' from [CommentsTables] where [Key]=@Key and [TableName]=@tableName) begin declare @StartID int; declare @EndID int; set @EndID = @tableArea * @Size; set @StartID = @EndID - (@Size-1); --创建表 declare @CreateSQL nvarchar(MAX); set @CreateSQL = 'Create table [dbo].['+@tableName+']( [ID] [int] IDENTITY(1,1) NOT NULL, [ParentID] [int] NOT NULL, [SourceID] [int] NOT NULL, [NickName] [nvarchar](20) NOT NULL, [Content] [nvarchar](300) NOT NULL, [Datetime] [datetime] NOT NULL, [IP] [nvarchar](30) NOT NULL, [City] [nvarchar](30) NOT NULL, [BeFiltered] [bit] NOT NULL, [Disable] [bit] NOT NULL, [Lou] [int] NOT NULL, [Ding] [int] NOT NULL, [Cai] [int] NOT NULL, CONSTRAINT [PK_'+@tableName+'] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]' EXEC(@CreateSQL); --创建索引 ID DESC EXEC(' CREATE UNIQUE NONCLUSTERED INDEX [IX_'+@tableName+'_ID_DESC] ON [dbo].['+@tableName+'] ( [ID] DESC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]'); --创建索引 Ding DESC EXEC(' CREATE NONCLUSTERED INDEX [IX_'+@tableName+'_Ding_DESC] ON [dbo].['+@tableName+'] ( [Ding] DESC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]'); --创建索引 SourceID DESC EXEC(' CREATE NONCLUSTERED INDEX [IX_'+@tableName+'_SourceID_DESC] ON [dbo].['+@tableName+'] ( [SourceID] DESC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]'); --创建索引 Lou DESC EXEC(' CREATE NONCLUSTERED INDEX [IX_'+@tableName+'_Lou_DESC] ON [dbo].['+@tableName+'] ( [Lou] DESC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]') --创建默认值 EXEC('ALTER TABLE [dbo].['+@tableName+'] ADD CONSTRAINT [DF_'+@tableName+'_ParentID] DEFAULT ((0)) FOR [ParentID]'); EXEC('ALTER TABLE [dbo].['+@tableName+'] ADD CONSTRAINT [DF_'+@tableName+'_Datetime] DEFAULT (getdate()) FOR [Datetime]'); EXEC('ALTER TABLE [dbo].['+@tableName+'] ADD CONSTRAINT [DF_'+@tableName+'_BeFiltered] DEFAULT ((0)) FOR [BeFiltered]'); EXEC('ALTER TABLE [dbo].['+@tableName+'] ADD CONSTRAINT [DF_'+@tableName+'_Disable] DEFAULT ((0)) FOR [Disable]'); EXEC('ALTER TABLE [dbo].['+@tableName+'] ADD CONSTRAINT [DF_'+@tableName+'_Lou] DEFAULT ((1)) FOR [Lou]'); EXEC('ALTER TABLE [dbo].['+@tableName+'] ADD CONSTRAINT [DF_'+@tableName+'_Ding] DEFAULT ((0)) FOR [Ding]'); EXEC('ALTER TABLE [dbo].['+@tableName+'] ADD CONSTRAINT [DF_'+@tableName+'_Cai] DEFAULT ((0)) FOR [Cai]'); Insert Into [CommentsTables]([Key],[TableName],[StartID],[EndID]) values(@Key,@tableName,@StartID,@EndID); end declare @TemLou int; declare @SQL nvarchar(MAX); set @SQL = N'select @TemLou = Count(ID) from dbo.['+@tableName+N'] where SourceID=@SourceID'; exec sp_executesql @SQL, N'@SourceID int,@TemLou int output', @SourceID, @TemLou output; if @TemLou = 0 set @TemLou = 1; else set @TemLou = @TemLou + 1; declare @Lou int; set @Lou = @TemLou; declare @InsertSQL nvarchar(MAX); set @InsertSQL = N'Insert Into dbo.['+@tableName+N'](ParentID,SourceID,NickName,Content,IP,City,BeFiltered,[Disable],[Lou]) values (@ParentID,@SourceID,@NickName,@Content,@IP,@City,@BeFiltered,@Disable,@Lou);select @InsertedID = SCOPE_IDENTITY();'; exec sp_executesql @InsertSQL, N'@ParentID int,@SourceID int,@NickName nvarchar(20),@Content nvarchar(300),@IP nvarchar(30),@City nvarchar(30),@BeFiltered bit,@Disable bit,@Lou int,@InsertedID int output', @ParentID, @SourceID, @NickName, @Content, @IP, @City, @BeFiltered, @Disable, @Lou, @InsertedID output; end GO --获得最新评论存储过程 CREATE proc [dbo].[procGetNewComments] ( @SourceID int, @Key nvarchar(50), @PageIndex int, @PageSize int, @Fields nvarchar(100), @PageCount int output ) as begin declare @tableName nvarchar(80); set @tableName = dbo.funGetTableName(@SourceID,@Key); declare @Rc int; declare @SQL nvarchar(MAX); set @SQL = N'select @Rc = COUNT(ID) from dbo.['+@tableName+N'] where SourceID = @SourceID'; exec sp_executesql @SQL, N'@SourceID int,@Rc int output', @SourceID, @Rc output; if @Rc % @PageSize > 0 set @PageCount = Cast(@Rc / @PageSize as int) + 1; else set @PageCount = Cast(@Rc / @PageSize as int); if @PageIndex = 1 begin set @SQL = N'select top '+Cast(@PageSize as nvarchar(30))+' '+@Fields + N' from dbo.['+@tableName+N'] where SourceID=@SourceID order by Lou desc'; exec sp_executesql @SQL, N'@SourceID int', @SourceID; end else begin declare @StartLou int; declare @EndLou int; --1 20 1 - 20,21- 40,41-60 set @EndLou = @Rc - (@PageIndex-1) * @PageSize; if @EndLou > @Rc set @EndLou = @Rc; set @StartLou = @EndLou - @PageSize + 1; if @StartLou < 1 set @StartLou = 1; set @SQL = N'select '+@Fields + N' from dbo.['+@tableName+N'] where Lou>=@StartLou and Lou<=@EndLou and SourceID = @SourceID order by Lou desc'; exec sp_executesql @SQL, N'@SourceID int,@StartLou int,@EndLou int', @SourceID,@StartLou,@EndLou; end end GO --踩 Create proc [dbo].[procCai] ( @ID int, @SourceID int, @key nvarchar(50), @Times int output ) as begin declare @tableName nvarchar(80); set @tableName = dbo.funGetTableName(@SourceID,@key); declare @SQL nvarchar(MAX); set @SQL = N'update dbo.['+@tableName+N'] set Cai=Cai+1 where ID=@ID;select @Times=Cai from dbo.['+@tableName+N'] where ID=@ID'; exec sp_executesql @SQL, N'@ID int,@Times int output', @ID, @Times output; end GO --顶 create proc [dbo].[procDing] ( @ID int, @SourceID int, @key nvarchar(50), @Times int output ) as begin declare @tableName nvarchar(80); set @tableName = dbo.funGetTableName(@SourceID,@key); declare @SQL nvarchar(MAX); set @SQL = N'update dbo.['+@tableName+N'] set Ding=Ding+1 where ID=@ID;select @Times=Ding from dbo.['+@tableName+N'] where ID=@ID'; exec sp_executesql @SQL, N'@ID int,@Times int output', @ID, @Times output; end GO

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Le 29 juillet, lors de la cérémonie de lancement de la 400 000e nouvelle voiture d'AITO Wenjie, Yu Chengdong, directeur général de Huawei, président de Terminal BG et président de la BU Smart Car Solutions, a assisté et prononcé un discours et a annoncé que les modèles de la série Wenjie seraient sera lancé cette année En août, la version Huawei Qiankun ADS 3.0 a été lancée et il est prévu de pousser successivement les mises à niveau d'août à septembre. Le Xiangjie S9, qui sortira le 6 août, lancera le système de conduite intelligent ADS3.0 de Huawei. Avec l'aide du lidar, la version Huawei Qiankun ADS3.0 améliorera considérablement ses capacités de conduite intelligente, disposera de capacités intégrées de bout en bout et adoptera une nouvelle architecture de bout en bout de GOD (identification générale des obstacles)/PDP (prédictive prise de décision et contrôle), fournissant la fonction NCA de conduite intelligente d'une place de stationnement à l'autre et mettant à niveau CAS3.0

À mesure que les fonctions des comptes vidéo WeChat continuent d'être mises à niveau, les utilisateurs ont des exigences de plus en plus élevées en matière d'interactivité des comptes vidéo. Parmi eux, de nombreuses personnes espèrent trouver leurs amis préférés grâce aux commentaires, puis les ajouter comme amis WeChat. Alors, comment ajouter comme amis les personnes qui commentent les comptes vidéo WeChat ? 1. Comment ajouter comme amis les personnes qui commentent les comptes vidéo WeChat ? 1. Recherchez les commentaires de vos amis préférés. Tout d'abord, vous devez trouver le commentaire dans le compte vidéo WeChat qui fait bouger votre cœur. Ceci peut être réalisé en parcourant la section commentaires du compte vidéo. Lorsque vous trouvez un commentaire intéressant, vous pouvez cliquer sur l'avatar du commentateur pour accéder à sa page d'accueil personnelle. 2. Suivez le compte vidéo et envoyez un message privé à la page d'accueil personnelle du commentateur. Vous pouvez voir son nom et son avatar WeChat. À ce stade, vous pouvez d'abord suivre le compte vidéo, puis cliquer sur

Le 11 avril, Huawei a officiellement annoncé pour la première fois le plan de mise à niveau de 100 machines HarmonyOS 4.2. Cette fois, plus de 180 appareils participeront à la mise à niveau, couvrant les téléphones mobiles, les tablettes, les montres, les écouteurs, les écrans intelligents et d'autres appareils. Au cours du mois dernier, avec la progression constante du plan de mise à niveau de 100 machines HarmonyOS4.2, de nombreux modèles populaires, notamment Huawei Pocket2, la série Huawei MateX5, la série nova12, la série Huawei Pura, etc., ont également commencé à être mis à niveau et à s'adapter, ce qui signifie qu'il y aura davantage d'utilisateurs de modèles Huawei pourront profiter de l'expérience commune et souvent nouvelle apportée par HarmonyOS. À en juger par les commentaires des utilisateurs, l'expérience des modèles de la série Huawei Mate60 s'est améliorée à tous égards après la mise à niveau d'HarmonyOS4.2. Surtout Huawei M

SpringDataJPA est basé sur l'architecture JPA et interagit avec la base de données via le mappage, l'ORM et la gestion des transactions. Son référentiel fournit des opérations CRUD et les requêtes dérivées simplifient l'accès à la base de données. De plus, il utilise le chargement paresseux pour récupérer les données uniquement lorsque cela est nécessaire, améliorant ainsi les performances.

La courbe d'apprentissage de l'architecture du framework Go dépend de la familiarité avec le langage Go et le développement back-end ainsi que de la complexité du framework choisi : une bonne compréhension des bases du langage Go. Il est utile d’avoir une expérience en développement back-end. Les cadres qui diffèrent en complexité entraînent des différences dans les courbes d'apprentissage.

Le mappage polymorphe Hibernate peut mapper les classes héritées à la base de données et fournit les types de mappage suivants : join-subclass : crée une table séparée pour la sous-classe, incluant toutes les colonnes de la classe parent. table par classe : créez une table distincte pour les sous-classes, contenant uniquement des colonnes spécifiques aux sous-classes. union-subclass : similaire à join-subclass, mais la table de classe parent réunit toutes les colonnes de la sous-classe.

Les dernières versions d'Apple des systèmes iOS18, iPadOS18 et macOS Sequoia ont ajouté une fonctionnalité importante à l'application Photos, conçue pour aider les utilisateurs à récupérer facilement des photos et des vidéos perdues ou endommagées pour diverses raisons. La nouvelle fonctionnalité introduit un album appelé "Récupéré" dans la section Outils de l'application Photos qui apparaîtra automatiquement lorsqu'un utilisateur a des photos ou des vidéos sur son appareil qui ne font pas partie de sa photothèque. L'émergence de l'album « Récupéré » offre une solution aux photos et vidéos perdues en raison d'une corruption de la base de données, d'une application d'appareil photo qui n'enregistre pas correctement dans la photothèque ou d'une application tierce gérant la photothèque. Les utilisateurs n'ont besoin que de quelques étapes simples

HTML ne peut pas lire directement la base de données, mais cela peut être réalisé via JavaScript et AJAX. Les étapes comprennent l'établissement d'une connexion à la base de données, l'envoi d'une requête, le traitement de la réponse et la mise à jour de la page. Cet article fournit un exemple pratique d'utilisation de JavaScript, AJAX et PHP pour lire les données d'une base de données MySQL, montrant comment afficher dynamiquement les résultats d'une requête dans une page HTML. Cet exemple utilise XMLHttpRequest pour établir une connexion à la base de données, envoyer une requête et traiter la réponse, remplissant ainsi les données dans les éléments de la page et réalisant la fonction de lecture HTML de la base de données.
