SQL表的设计以获得最佳性能

问题描述 投票:0回答:3

我设计了MVC asp.net web应用程序上的几家餐馆管理预订。

我最关心的是,当用户希望得到所有的预订,特定日期,特定餐厅DB的性能。

我有以下的列/数据类型的一个表:

  • [ID] - INT
  • [RestaurantId] - INT
  • [开始日期时间 - 日期时间
  • [ServiceDuration] - INT
  • [WorkerId] - 为nvarchar(128)
  • [SERVICEID] - INT
  • [CostumerId] - INT
  • [注释] - 为nvarchar(128)

我试图找出是否有只有一个表像这样,能有行的一个非常大的量,是最好的数据库设计方法

一种选择是有一个第二个表只有我需要查询的,因为我读的列,以便多个表较少的列比使用多列的表少好:

  • [ID] - INT
  • [RestaurantId] - INT
  • [开始日期时间 - 日期时间
  • [BookingId] - INT(指向一个预定ID在第一个表)
sql-server query-performance
3个回答
0
投票

一个表是好的。

如果你只需要4个领域在你的日常预订报告有只是其中的SQL SELECT子句中,以便它只是在相关领域还给你,尽量减少转移到你的日期。


0
投票

在我看来,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到非第一的位置,那么你不会有索引查找。


0
投票

您的情况是为其标准的三个表设计,结合表可能会作出最感。我建议餐馆和预订两个表:

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);
© www.soinside.com 2019 - 2024. All rights reserved.