我目前正在试验SabreDAV,这是一个用于PHP的WebDAV/CalDAV/CardDAV服务器。
作为下载的一部分,有一个PDO后端,它将日历事件存储在像MySQL这样的数据库中。
我注意到SabreDAV使用BLOB字段将事件的iCal数据存储在1个字段中,而不是存储在行中适当规范化的字段中。
mysql> select * from calendarobjects \G
*************************** 1. row ***************************
id: 2
calendardata: BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Apple Inc.//Mac OS X 10.10.5//EN
CALSCALE:GREGORIAN
BEGIN:VTIMEZONE
TZID:Europe/Brussels
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
DTSTART:19810329T020000
TZNAME:CEST
TZOFFSETTO:+0200
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
DTSTART:19961027T030000
TZNAME:CET
TZOFFSETTO:+0100
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
CREATED:20150825T141801Z
UID:B26931A6-6F8A-4CB6-95F2-C5567B7D64BA
DTEND;TZID=Europe/Brussels:20150826T151500
TRANSP:OPAQUE
SUMMARY:My meeting
DTSTART;TZID=Europe/Brussels:20150826T143000
DTSTAMP:20150825T141801Z
SEQUENCE:0
END:VEVENT
END:VCALENDAR
uri: B26931A6-6F8A-4CB6-95F2-C5567B7D64BA.ics
calendarid: 1
lastmodified: 1440512292
etag: 969a888bab9c906f0d7f10c23a856341
size: 712
componenttype: VEVENT
firstoccurence: 1440592200
lastoccurence: 1440594900
uid: B26931A6-6F8A-4CB6-95F2-C5567B7D64BA
1 row in set (0.00 sec)正如您所看到的,有一个很大的字段“日历数据”,其中包含iCal格式的所有内容。
从我对Milton ( SabreDAV的Java对应物)的简要探索来看,情况似乎也是如此,所以不仅仅是在SabreDAV中。但是,我可能弄错了。
为什么要将iCal数据存储在BLOB中,而不是存储解析后的数据,是否有特定的体系结构原因?I iCal数据可能如此复杂,以至于无法以完全标准化的方式进行拟合?或者,你认为开发者选择这样做是为了节省时间吗?
我希望将数据存储在列和行中,这样我就可以很容易地在带有日历events...but的网站上生成表,现在我需要解析出所有的数据,并且我不能使用SQL...否则我需要使用一个完整的CalDAV client...but,这有点过分了。
我已经发现的一个特殊问题是,一个重复的事件在数据库中是1条记录,而不是多条记录。现在确定单个事件将非常困难。
发布于 2015-08-30 05:12:37
实际上,要将格式完全规范化为RDMS真的很难。许多属性可以多次出现,必须支持自定义属性以及自定义参数。
正如Eborbob还提到的那样,收益将是使其中一些数据易于搜索/可索引,这实际上也发生在一些领域,包括UID。
https://stackoverflow.com/questions/32206454
复制相似问题