| | 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 | |