目前,我有此签到数据,其中每次签到都有签到详细信息、活动和额外物品总费用(某些活动需要额外物品)。
在 UNF 中,我将它们分成 3 个重复组:
CHECKIN ( (customer_id, customer_name, check_in_d&t, main_tour_guide),
(activity_code, activity_name, prescribing_tour_guide, completing_tour_guide, activity_d&t,activity_cost),
(item_code, description, quantity, total_item_charge, quantity, total_extra_item_charges ) )
如果我将 total_extra_item_charges 分组在 item 下,我将得到 3NF:
TOTALITEMCHARGES ( customer_id, activity_d&t , total_extra_item_charges)
ACTIVITYSCHEDULE ( customer_id, activity_d&t , activity_code, prescribing_tour_guide, completing_tour_guide)
这两个共享相同的主键,所以我应该将 total_extra_item_charges 分组在活动时间表下,因为 1 项活动只有 1 项总额外费用?但似乎有些不对劲?
*d&t 表示日期和时间
与活动放在
total_extra_item_charges
同一张桌子上。您正在不必要地重复customer_id
,并且activity_d&t
对于您指示的单个列不会超过一行。尽量避免过度规范化。我还建议在唯一标识列(例如
activity_schedule_id
)上使用主键。根据您加粗的customer_id
andactivity_d&t
,您似乎正在使用复合主键。日期时间列通常不适合作为主键,并且会增加大量的物理开销。相反,我会添加一个非聚集索引和外键,customer_id
并在activity_d&t
.根据此数据库的事务量,您可能还希望拆分日期和时间部分
activity_d&t
以便更快地进行连接查找。例如activity_date
和activity_time
。请注意您使用的精度级别time
- 您需要秒和毫秒吗?如果您只需要精确到分钟,请确保您没有存储这些数据,因为您可以节省大量空间。