我正在开发租赁商店管理系统,我有一个名为 shops
的表:
ID int
shop_id int
size decimal(4, 1)
location nvarchar(50)
floor nvarchar(10)
status bit
date date
app_user nvarchar(20)
archive bit
shops
表包含一个状态列来显示其状态,如果存在有效合同,则此状态值取决于 contracts
表(这意味着合同未到期,例如合同的结束日期)合同大于当前日期)对于这家商店,状态将是 1 为租用,每个合同可能有多个商店,因此还有另一个名为 contracts_shops
的表将合同与商店的表连接起来。知道同一个商店可以有多个合同,例如:
contract_ID | 商店 | start_date | end_date |
---|---|---|---|
1 | 1-2 | 10-05-2020 | 10-05-2021 |
2 | 1-2 | 11-05-2021 | 11-05-2022 |
我需要确保所有商店的状态都是正确的,因为如果商店的状态是租用的,用户就不能租用商店。我现在正在做什么,当有新合同时,我检查日期,如果合同开始日期等于当前日期,我将商店状态更新为出租。如果不是我让商店免费,在这种情况下,我创建了一个预定的工作,每天在特定时间检查 end_date 等于当前日期的所有合同,并使这些合同的所有商店状态免费:
UPDATE shops set status = 0 where shop_id in (select contracts_shops.shop_id from contracts
INNER JOIN contracts_shops ON contracts_shops.contract_id=contracts.ID
where contracts.date_end = Cast(GETDATE() as date))
另一个检查所有 start_date 等于当前时间的合同并将这些合同的商店状态更改为租用:
UPDATE shops set status = 1 where shop_id in (select contracts_shops.shop_id from contracts
INNER JOIN contracts_shops ON contracts_shops.contract_id=contracts.ID
where contracts.date_start = Cast(GETDATE() as date))
这是实现此目的的好方法吗??我可以做任何改进或进行任何更改以使其更可靠吗??
这是我的完整数据库脚本:
CREATE TABLE [dbo].[cheque_in](
[ID] [int] IDENTITY(1,1) NOT NULL,
[account_number] [int] NULL,
[cheque_number] [int] NOT NULL,
[cheque_value] [decimal](10, 2) NOT NULL,
[cheque_due_date] [date] NOT NULL,
[cheque_bank] [nvarchar](55) NULL,
[cheque_branch] [nvarchar](55) NULL,
[holder_name] [nvarchar](250) NULL,
[date] [date] NOT NULL,
[note] [nvarchar](max) NULL,
[pay_id] [int] NULL,
[app_user] [nvarchar](20) NULL,
CONSTRAINT [PK_cheque_in] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
/****** Object: Table [dbo].[contracts] Script Date: 04/05/2021 07:00:51 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[contracts](
[ID] [int] IDENTITY(1,1) NOT NULL,
[cust_id] [int] NOT NULL,
[duration] [int] NOT NULL,
[price] [decimal](10, 2) NOT NULL,
[tax] [decimal](10, 2) NULL,
[usage] [nvarchar](20) NOT NULL,
[rent_type] [nvarchar](10) NOT NULL,
[price2] [decimal](10, 2) NULL,
[note2] [nvarchar](max) NULL,
[date_start] [date] NOT NULL,
[date_end] [date] NOT NULL,
[note] [nvarchar](max) NULL,
[image] [varbinary](max) NULL,
[app_user] [nvarchar](20) NULL,
[archive] [bit] NOT NULL,
CONSTRAINT [PK_contracts] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
/****** Object: Table [dbo].[contracts_shops] Script Date: 04/05/2021 07:00:51 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[contracts_shops](
[ID] [int] IDENTITY(1,1) NOT NULL,
[contract_id] [int] NOT NULL,
[shop_id] [int] NOT NULL,
[date] [datetime] NOT NULL,
CONSTRAINT [PK_contracts_shops] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[customers] Script Date: 04/05/2021 07:00:51 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[customers](
[ID] [int] IDENTITY(1,1) NOT NULL,
[cust_id] [int] NOT NULL,
[name] [nvarchar](50) NULL,
[nickname] [nvarchar](50) NULL,
[city] [nvarchar](50) NULL,
[phone1] [nvarchar](10) NULL,
[phone2] [nvarchar](10) NULL,
[phone3] [nvarchar](10) NULL,
[email] [nvarchar](50) NULL,
[image] [varbinary](max) NULL,
[date] [date] NULL,
[app_user] [nvarchar](20) NULL,
[archive] [bit] NULL,
CONSTRAINT [PK_customers] PRIMARY KEY CLUSTERED
(
[cust_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
/****** Object: Table [dbo].[invoices] Script Date: 04/05/2021 07:00:51 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[invoices](
[ID] [int] IDENTITY(1,1) NOT NULL,
[con_id] [int] NOT NULL,
[value] [decimal](10, 2) NOT NULL,
[due_date] [date] NULL,
[date] [date] NULL,
CONSTRAINT [PK_due_payments] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[payments] Script Date: 04/05/2021 07:00:51 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[payments](
[ID] [int] IDENTITY(1,1) NOT NULL,
[inv_id] [int] NULL,
[note] [nvarchar](max) NULL,
[date] [date] NULL,
[app_user] [nvarchar](20) NULL,
CONSTRAINT [PK_invoices] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
/****** Object: Table [dbo].[payments_details] Script Date: 04/05/2021 07:00:51 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[payments_details](
[ID] [int] IDENTITY(1,1) NOT NULL,
[pay_id] [int] NOT NULL,
[value] [decimal](10, 2) NULL,
[method] [nvarchar](20) NULL,
[date] [date] NULL,
CONSTRAINT [PK_Payment_yearly_details] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[shops] Script Date: 04/05/2021 07:00:51 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[shops](
[ID] [int] IDENTITY(1,1) NOT NULL,
[shop_id] [int] NOT NULL,
[size] [decimal](4, 1) NULL,
[location] [nvarchar](50) NULL,
[floor] [nvarchar](10) NULL,
[status] [bit] NULL,
[date] [date] NULL,
[app_user] [nvarchar](20) NULL,
[archive] [bit] NULL,
CONSTRAINT [PK_shops] PRIMARY KEY CLUSTERED
(
[shop_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[users] Script Date: 04/05/2021 07:00:51 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[users](
[ID] [int] IDENTITY(1,1) NOT NULL,
[fname] [nvarchar](50) NOT NULL,
[lname] [nvarchar](50) NOT NULL,
[uname] [nvarchar](20) NOT NULL,
[pass] [nvarchar](20) NOT NULL,
[gender] [nvarchar](5) NOT NULL,
[type] [nvarchar](5) NOT NULL,
[date] [date] NULL,
[image] [varbinary](max) NULL,
[run_app] [bit] NULL,
[add_data] [bit] NULL,
[delete_data] [bit] NULL,
[edit_data] [bit] NULL,
[print_data] [bit] NULL,
[add_users] [bit] NULL,
CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO