我目前正在尝试使用SabreDAV,一种用于PHP的WebDAV / CalDAV / CardDAV服务器。
作为下载的一部分,有一个PDO后端可以将日历事件存储在像MySQL这样的数据库中。
我注意到SabreDAV使用BLOB字段在1个字段中存储事件的iCal数据,而不是在行中正确规范化的字段中存储。
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中而不是存储解析数据?我的iCal数据可能非常复杂,不能完全正常化吗?或者,您认为开发人员选择这个来节省时间吗?
我希望将数据存储在列和行中,因此我可以轻松地在带有日历事件的网站上生成表格...但是现在我需要解析所有数据而我不能使用SQL ...或者我需要使用一个完整的CalDAV客户端......但这太过分了。
我已经发现的一个特殊问题是重复事件是数据库中的1条记录,而不是多条记录。现在确定个别事件将非常困难。
答案 0 :(得分:0)
实际上很难将格式完全标准化为RDMS。许多属性可以多次出现,必须支持自定义属性以及自定义参数。
正如Eborbob所提到的那样,收益可以让一些数据易于搜索/索引,而实际上这也发生在一些领域,包括UID
。