我设计了MVC asp.net web应用程序上的几家餐馆管理预订。
我最关心的是,当用户希望得到所有的预订,特定日期,特定餐厅DB的性能。
我有以下的列/数据类型的一个表:
我试图找出是否有只有一个表像这样,能有行的一个非常大的量,是最好的数据库设计方法
一种选择是有一个第二个表只有我需要查询的,因为我读的列,以便多个表较少的列比使用多列的表少好:
一个表是好的。
如果你只需要4个领域在你的日常预订报告有只是其中的SQL SELECT子句中,以便它只是在相关领域还给你,尽量减少转移到你的日期。
在我看来,the design of the table is normalized和所有是好的。你可以做的仅仅是场StartDateTime
这样的覆盖索引:
CREATE NONCLUSTERED INDEX [IX_YourTable_StartDateTime_RestaurantId_BookingId_Id ]
ON dbo.YourTable
(StartDateTime, RestaurantId, BookingId, Id)
GO
与索引,你将有索引的查询计划寻求时,你会写你所需的查询:
Select
RestaurantId
, BookingId
, Id
YourTable
WHERE StartDateTime = '...'
注重列的索引(StartDateTime, RestaurantId, BookingId, Id)
的顺序。如果移动StartDateTime
到非第一的位置,那么你不会有索引查找。
您的情况是为其标准的三个表设计,结合表可能会作出最感。我建议餐馆和预订两个表:
Restaurant
id
name
type
notes
Booking
id
date
然后,创建内容涉及餐饮其预订第三结表:
RestaurantBooking
restaurant_id
booking_id
PK (restaurant_id, booking_id)
这是一个标准化的方法,它可以让您存储餐厅预订以高效的方式,在不脱离关系的两侧重复的元数据。
为了找到今天给定餐厅所有的预订,你可以尝试:
SELECT b.*
FROM Booking b
INNER JOIN RestaurantBooking rb
ON b.id = rb.booking_id
INNER JOIN Restaurant r
ON rb.restaurant_id = r.id
WHERE
r.name = 'Tavern on the Green' AND
b.date = CAST(GETDATE() AS date);