| 1 | == Креирање на табели == |
| 2 | |
| 3 | {{{ |
| 4 | #!sql |
| 5 | CREATE TABLE [dbo].[Business] |
| 6 | ( |
| 7 | [Id] INT IDENTITY (1, 1) NOT NULL, |
| 8 | [Name] NVARCHAR (100) NOT NULL, |
| 9 | [Address] NVARCHAR (200) NOT NULL, |
| 10 | [Rating] REAL NOT NULL, |
| 11 | [PhoneNumber] NVARCHAR(15) NOT NULL, |
| 12 | [BackGroundImage] VARBINARY(MAX) NULL, |
| 13 | [Logo] VARBINARY(MAX) NULL, |
| 14 | [IsOpen] BIT NOT NULL, |
| 15 | [IsAvailable] BIT NOT NULL, |
| 16 | [Type] INT NOT NULL, |
| 17 | [OwnerId] INT NOT NULL, |
| 18 | [CreatedAt] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 19 | [UpdatedAt] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 20 | [DeletedAt] DATETIME2 NULL, |
| 21 | [IsDeleted] BIT NOT NULL DEFAULT 0, |
| 22 | CONSTRAINT [PK_Business] PRIMARY KEY CLUSTERED ([Id] ASC), |
| 23 | CONSTRAINT [FK_Business_User_OwnerId] FOREIGN KEY (OwnerId) REFERENCES [User]([Id]) ON DELETE NO ACTION, |
| 24 | ); |
| 25 | }}} |
| 26 | |
| 27 | {{{ |
| 28 | #!sql |
| 29 | CREATE TABLE [dbo].[FoodCategory] |
| 30 | ( |
| 31 | [Id] INT IDENTITY (1, 1) NOT NULL, |
| 32 | [Name] NVARCHAR (100) NOT NULL, |
| 33 | [IsAvailable] BIT NOT NULL, |
| 34 | [BusinessId] INT NOT NULL, |
| 35 | [CreatedAt] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 36 | [UpdatedAt] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 37 | [DeletedAt] DATETIME2 NULL, |
| 38 | [IsDeleted] BIT NOT NULL DEFAULT 0, |
| 39 | CONSTRAINT [PK_FoodCategory] PRIMARY KEY CLUSTERED ([Id] ASC), |
| 40 | CONSTRAINT [FK_FoodCategory_Business_BusinessId] FOREIGN KEY (BusinessId) REFERENCES [Business]([Id]) ON DELETE CASCADE, |
| 41 | ); |
| 42 | }}} |
| 43 | |
| 44 | {{{ |
| 45 | #!sql |
| 46 | CREATE TABLE [dbo].[FoodItem] |
| 47 | ( |
| 48 | [Id] INT IDENTITY (1, 1) NOT NULL, |
| 49 | [Name] NVARCHAR (100) NOT NULL, |
| 50 | [Price] INT NOT NULL, |
| 51 | [Description] NVARCHAR (300) NULL, |
| 52 | [IsAvailable] BIT NOT NULL, |
| 53 | [FoodItemImage] VARBINARY(MAX), |
| 54 | [FoodCategoryId] INT NOT NULL, |
| 55 | [CreatedAt] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 56 | [UpdatedAt] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 57 | [DeletedAt] DATETIME2 NULL, |
| 58 | [IsDeleted] BIT NOT NULL DEFAULT 0, |
| 59 | CONSTRAINT [PK_FoodItem] PRIMARY KEY CLUSTERED ([Id] ASC), |
| 60 | CONSTRAINT [FK_FoodItem_FoodCategory_FoodCategoryId] FOREIGN KEY (FoodCategoryId) REFERENCES [FoodCategory]([Id]) ON DELETE CASCADE, |
| 61 | ); |
| 62 | }}} |
| 63 | |
| 64 | {{{ |
| 65 | #!sql |
| 66 | CREATE TABLE [dbo].[ItemInOrder] |
| 67 | ( |
| 68 | [Id] INT IDENTITY (1, 1) NOT NULL, |
| 69 | [Quantity] INT NOT NULL, |
| 70 | [FoodItemId] INT NOT NULL, |
| 71 | [OrderId] INT NOT NULL, |
| 72 | CONSTRAINT [PK_ItemInOrder] PRIMARY KEY CLUSTERED ([Id] ASC), |
| 73 | CONSTRAINT [FK_ItemInOrder_FoodItem_FoodItemId] FOREIGN KEY (FoodItemId) REFERENCES [FoodItem]([Id]) ON DELETE NO ACTION, |
| 74 | CONSTRAINT [FK_ItemInOrder_Order_OrderId] FOREIGN KEY (OrderId) REFERENCES [Order]([Id]) ON DELETE CASCADE, |
| 75 | ); |
| 76 | }}} |
| 77 | |
| 78 | {{{ |
| 79 | #!sql |
| 80 | CREATE TABLE [dbo].[ItemInShoppingCart] |
| 81 | ( |
| 82 | [Id] INT IDENTITY (1, 1) NOT NULL, |
| 83 | [Quantity] INT NOT NULL, |
| 84 | [FoodItemId] INT NOT NULL, |
| 85 | [ShoppingCartId] INT NOT NULL, |
| 86 | [CreatedAt] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 87 | [UpdatedAt] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 88 | [DeletedAt] DATETIME2 NULL, |
| 89 | [IsDeleted] BIT NOT NULL DEFAULT 0, |
| 90 | CONSTRAINT [PK_ItemInShoppingCart] PRIMARY KEY CLUSTERED ([Id] ASC), |
| 91 | CONSTRAINT [FK_ItemInShoppingCart_FoodItem_FoodItemId] FOREIGN KEY (FoodItemId) REFERENCES [FoodItem]([Id]) ON DELETE NO ACTION, |
| 92 | CONSTRAINT [FK_ItemInShoppingCart_ShoppingCard_ShoppingCartId] FOREIGN KEY (ShoppingCartId) REFERENCES [ShoppingCart]([Id]) ON DELETE CASCADE, |
| 93 | ); |
| 94 | }}} |
| 95 | |
| 96 | {{{ |
| 97 | #!sql |
| 98 | CREATE TABLE [dbo].[Order] |
| 99 | ( |
| 100 | [Id] INT IDENTITY (1, 1) NOT NULL, |
| 101 | [OrderGlobalStatus] INT NOT NULL, |
| 102 | [TotalPrice] DECIMAL NOT NULL, |
| 103 | [DeliveryFee] DECIMAL NOT NULL, |
| 104 | [CustomerId] INT NOT NULL, |
| 105 | [DeliveryDriverId] INT NULL, |
| 106 | [BusinessId] INT NOT NULL, |
| 107 | [CreatedAt] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 108 | [UpdatedAt] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 109 | [DeletedAt] DATETIME2 NULL, |
| 110 | [IsDeleted] BIT NOT NULL DEFAULT 0, |
| 111 | CONSTRAINT [PK_Order] PRIMARY KEY CLUSTERED ([Id] ASC), |
| 112 | CONSTRAINT [FK_Order_User_CustomerId] FOREIGN KEY (CustomerId) REFERENCES [User]([Id]) ON DELETE NO ACTION, |
| 113 | CONSTRAINT [FK_Order_User_DeliveryDriverId] FOREIGN KEY (DeliveryDriverId) REFERENCES [User]([Id]) ON DELETE NO ACTION, |
| 114 | CONSTRAINT [FK_Order_Business_BusinessId] FOREIGN KEY (BusinessId) REFERENCES [Business]([Id]) ON DELETE NO ACTION, |
| 115 | ); |
| 116 | }}} |
| 117 | |
| 118 | {{{ |
| 119 | #!sql |
| 120 | CREATE TABLE [dbo].[OrderHistory] |
| 121 | ( |
| 122 | [Id] INT IDENTITY (1, 1) NOT NULL, |
| 123 | [TimeStamp] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 124 | [OrderGlobalStatus] INT NOT NULL, |
| 125 | [OrderId] INT NOT NULL, |
| 126 | [UpdaterUserId] INT NOT NULL, |
| 127 | [CreatedAt] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 128 | [UpdatedAt] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 129 | [DeletedAt] DATETIME2 NULL, |
| 130 | [IsDeleted] BIT NOT NULL DEFAULT 0, |
| 131 | CONSTRAINT [PK_OrderHistory] PRIMARY KEY CLUSTERED ([Id] ASC), |
| 132 | CONSTRAINT [FK_OrderHistory_Order_OrderId] FOREIGN KEY (OrderId) REFERENCES [Order]([Id]) ON DELETE CASCADE, |
| 133 | CONSTRAINT [FK_OrderHistory_User_UpdaterUserId] FOREIGN KEY (UpdaterUserId) REFERENCES [User]([Id]) ON DELETE NO ACTION, |
| 134 | ); |
| 135 | }}} |
| 136 | |
| 137 | {{{ |
| 138 | #!sql |
| 139 | CREATE TABLE [dbo].[Role] |
| 140 | ( |
| 141 | [Id] INT IDENTITY (1, 1) NOT NULL, |
| 142 | [Name] NVARCHAR (50) NOT NULL, |
| 143 | CONSTRAINT [PK_Role] PRIMARY KEY CLUSTERED ([Id] ASC), |
| 144 | ); |
| 145 | }}} |
| 146 | |
| 147 | {{{ |
| 148 | #!sql |
| 149 | CREATE TABLE [dbo].[ShoppingCart] |
| 150 | ( |
| 151 | [Id] INT IDENTITY (1, 1) NOT NULL, |
| 152 | [OwnerId] INT NOT NULL, |
| 153 | CONSTRAINT [PK_ShoppingCart] PRIMARY KEY CLUSTERED ([Id] ASC), |
| 154 | CONSTRAINT [FK_ShoppingCart_User_OwnerId] FOREIGN KEY (OwnerId) REFERENCES [User]([Id]) ON DELETE CASCADE, |
| 155 | ); |
| 156 | }}} |
| 157 | |
| 158 | {{{ |
| 159 | #!sql |
| 160 | CREATE TABLE [dbo].[Token] |
| 161 | ( |
| 162 | [Id] INT IDENTITY (1, 1) NOT NULL, |
| 163 | [AccessToken] NVARCHAR (MAX) NOT NULL, |
| 164 | [RefreshToken] NVARCHAR (MAX) NOT NULL, |
| 165 | [AccessTokenExpirationDate] DATETIME2 NOT NULL, |
| 166 | [RefreshTokenExpirationDate] DATETIME2 NOT NULL, |
| 167 | [UserId] INT NOT NULL, |
| 168 | CONSTRAINT [PK_Token] PRIMARY KEY CLUSTERED ([Id] ASC), |
| 169 | CONSTRAINT [FK_Token_User_UserId] FOREIGN KEY (UserId) REFERENCES [User]([Id]) ON DELETE CASCADE, |
| 170 | ); |
| 171 | }}} |
| 172 | |
| 173 | {{{ |
| 174 | #!sql |
| 175 | CREATE TABLE [dbo].[User] |
| 176 | ( |
| 177 | [Id] INT IDENTITY (1, 1) NOT NULL, |
| 178 | [Email] NVARCHAR (50) NOT NULL UNIQUE, |
| 179 | [PasswordHash] NVARCHAR (200) NOT NULL, |
| 180 | [FirstName] NVARCHAR (100) NOT NULL, |
| 181 | [LastName] NVARCHAR (100) NOT NULL, |
| 182 | [RoleId] INT NOT NULL, |
| 183 | [CreatedAt] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 184 | [UpdatedAt] DATETIME2 NOT NULL DEFAULT GETUTCDATE(), |
| 185 | [DeletedAt] DATETIME2 NULL, |
| 186 | [IsDeleted] BIT NOT NULL DEFAULT 0, |
| 187 | CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED ([Id] ASC), |
| 188 | CONSTRAINT [FK_User_Role_RoleId] FOREIGN KEY (RoleId) REFERENCES [Role]([Id]) ON DELETE CASCADE, |
| 189 | ); |
| 190 | }}} |
| 191 | |
| 192 | ---- |
| 193 | |
| 194 | == Креирање на тест податоци == |
| 195 | |
| 196 | {{{ |
| 197 | #!sql |
| 198 | DECLARE @RoleId INT = 1; |
| 199 | DECLARE @NumberOfUsers INT = 1000; |
| 200 | DECLARE @InsertedUsers INT = 0; |
| 201 | DECLARE @BatchSize INT = 1000; |
| 202 | |
| 203 | WHILE @InsertedUsers < @NumberOfUsers |
| 204 | BEGIN |
| 205 | INSERT INTO [dbo].[User] |
| 206 | (Email, PasswordHash, FirstName, LastName, RoleId, CreatedAt, UpdatedAt, DeletedAt, IsDeleted) |
| 207 | SELECT TOP (@BatchSize) |
| 208 | CONCAT('user', ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) + @InsertedUsers, '@example.com'), |
| 209 | 'AQAAAAIAAYagAAAAEDiHqhqrUlhjMSqG+Wm9CP10wIioySTDOI1PEgvzV5uIoRhJAXdrXLLqQ6mSsw3lug==', |
| 210 | CONCAT('FirstName', ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) + @InsertedUsers), |
| 211 | CONCAT('LastName', ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) + @InsertedUsers), |
| 212 | @RoleId, |
| 213 | DATEADD(SECOND, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) + @InsertedUsers, GETUTCDATE()), |
| 214 | DATEADD(SECOND, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) + @InsertedUsers, GETUTCDATE()), |
| 215 | NULL, |
| 216 | 0 |
| 217 | FROM sys.objects a CROSS JOIN sys.objects b; |
| 218 | |
| 219 | SET @InsertedUsers = @InsertedUsers + @BatchSize; |
| 220 | END; |
| 221 | }}} |
| 222 | |
| 223 | {{{ |
| 224 | #!sql |
| 225 | DECLARE @NumberOfUsers INT = 10000; |
| 226 | DECLARE @NumberOfOrders INT = 20000000; |
| 227 | DECLARE @InsertedOrders INT = 0; |
| 228 | DECLARE @BatchSize INT = 20000; |
| 229 | DECLARE @StartDate DATETIME2 = '2021-01-01'; |
| 230 | DECLARE @EndDate DATETIME2 = '2024-12-31'; |
| 231 | |
| 232 | WHILE @InsertedOrders < @NumberOfOrders |
| 233 | BEGIN |
| 234 | INSERT INTO [dbo].[Order] |
| 235 | (OrderGlobalStatus, TotalPrice, DeliveryFee, CustomerId, DeliveryDriverId, BusinessId, CreatedAt, UpdatedAt, DeletedAt, IsDeleted) |
| 236 | SELECT TOP (@BatchSize) |
| 237 | CASE WHEN (ABS(CHECKSUM(NEWID())) % 10) = 0 THEN 1 ELSE (ABS(CHECKSUM(NEWID())) % 5) + 2 END, |
| 238 | CAST((ABS(CHECKSUM(NEWID())) % 9000 + 1000) / 100.0 AS DECIMAL(10,2)), |
| 239 | CAST((ABS(CHECKSUM(NEWID())) % 800 + 200) / 100.0 AS DECIMAL(10,2)), |
| 240 | (ABS(CHECKSUM(NEWID())) % @NumberOfUsers) + 1, |
| 241 | CASE WHEN (ABS(CHECKSUM(NEWID())) % 10) = 0 THEN NULL ELSE (ABS(CHECKSUM(NEWID())) % @NumberOfUsers) + 1 END, |
| 242 | (ABS(CHECKSUM(NEWID())) % 3) + 1, |
| 243 | DATEADD(SECOND, ABS(CHECKSUM(NEWID())) % DATEDIFF(SECOND, @StartDate, @EndDate), @StartDate), |
| 244 | DATEADD(MINUTE, ABS(CHECKSUM(NEWID())) % 121, DATEADD(SECOND, ABS(CHECKSUM(NEWID())) % DATEDIFF(SECOND, @StartDate, @EndDate), @StartDate)), |
| 245 | NULL, |
| 246 | 0 |
| 247 | FROM sys.objects a CROSS JOIN sys.objects b; |
| 248 | |
| 249 | SET @InsertedOrders = @InsertedOrders + @BatchSize; |
| 250 | PRINT CONCAT('Orders inserted: ', @InsertedOrders); |
| 251 | END; |
| 252 | }}} |
| 253 | |
| 254 | {{{ |
| 255 | #!sql |
| 256 | -- ======================================== |
| 257 | -- Insert ItemInOrder (batch) |
| 258 | -- ======================================== |
| 259 | DECLARE @InsertedItems INT = 0; |
| 260 | DECLARE @NumberOfItemsInOrder INT = 40000000 |
| 261 | DECLARE @NumberOfOrders INT = 32980003 |
| 262 | DECLARE @BatchSize INT = 20000 |
| 263 | |
| 264 | WHILE @InsertedItems < @NumberOfItemsInOrder |
| 265 | BEGIN |
| 266 | INSERT INTO [dbo].[ItemInOrder] |
| 267 | (Quantity, FoodItemId, OrderId) |
| 268 | SELECT TOP (@BatchSize) |
| 269 | |
| 270 | -- Quantity between 1 and 5 |
| 271 | (ABS(CHECKSUM(NEWID())) % 5) + 1 AS Quantity, |
| 272 | |
| 273 | -- FoodItemId only between 1 and 17 |
| 274 | (ABS(CHECKSUM(NEWID())) % 17) + 1 as FoodItemId, |
| 275 | |
| 276 | -- Attach to random existing order |
| 277 | (ABS(CHECKSUM(NEWID())) % @NumberOfOrders) + 1 AS OrderId |
| 278 | FROM sys.objects a CROSS JOIN sys.objects b; |
| 279 | |
| 280 | SET @InsertedItems = @InsertedItems + @BatchSize; |
| 281 | PRINT CONCAT('ItemInOrder inserted: ', @InsertedItems); |
| 282 | END |
| 283 | }}} |
| 284 | |
| 285 | {{{ |
| 286 | #!sql |
| 287 | |
| 288 | -- ======================================== |
| 289 | -- Parameters |
| 290 | -- ======================================== |
| 291 | |
| 292 | DECLARE @NumberOfOrderHistory INT = 15000000; -- change as needed |
| 293 | DECLARE @NumberOfUsers INT = 1000; |
| 294 | DECLARE @NumberOfOrders INT = 10000000 |
| 295 | DECLARE @InsertedHistory INT = 0; |
| 296 | DECLARE @BatchSize INT = 20000 |
| 297 | |
| 298 | |
| 299 | -- ======================================== |
| 300 | -- Insert OrderHistory (batch) |
| 301 | -- ======================================== |
| 302 | |
| 303 | |
| 304 | WHILE @InsertedHistory < @NumberOfOrderHistory |
| 305 | BEGIN |
| 306 | INSERT INTO [dbo].[OrderHistory] |
| 307 | (TimeStamp, OrderGlobalStatus, OrderId, UpdaterUserId, CreatedAt, UpdatedAt, DeletedAt, IsDeleted) |
| 308 | SELECT TOP (@BatchSize) |
| 309 | DATEADD(MINUTE, -ROW_NUMBER() OVER(ORDER BY (SELECT NULL)), GETUTCDATE()), |
| 310 | |
| 311 | -- Random status |
| 312 | (ABS(CHECKSUM(NEWID())) % 6) + 1 AS OrderGlobalStatus, |
| 313 | |
| 314 | -- Random order id (must exist from Orders table) |
| 315 | (ABS(CHECKSUM(NEWID())) % @NumberOfOrders) + 1 AS OrderId, |
| 316 | |
| 317 | -- Random updater user |
| 318 | (ABS(CHECKSUM(NEWID())) % @NumberOfUsers) + 1 AS UpdaterUserId, |
| 319 | |
| 320 | GETUTCDATE(), |
| 321 | GETUTCDATE(), |
| 322 | NULL, |
| 323 | 0 |
| 324 | FROM sys.objects a CROSS JOIN sys.objects b; |
| 325 | |
| 326 | SET @InsertedHistory = @InsertedHistory + @@ROWCOUNT; |
| 327 | PRINT CONCAT('OrderHistory inserted: ', @InsertedHistory); |
| 328 | END |
| 329 | |
| 330 | |
| 331 | }}} |
| 332 | |
| 333 | |
| 334 | |
| 335 | |