SabreDAV - 为什么日历事件在PDO后端​​存储为BLOB?

时间:2015-08-25 14:16:28

标签: php sabredav

我目前正在尝试使用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条记录,而不是多条记录。现在确定个别事件将非常困难。

1 个答案:

答案 0 :(得分:0)

实际上很难将格式完全标准化为RDMS。许多属性可以多次出现,必须支持自定义属性以及自定义参数。

正如Eborbob所提到的那样,收益可以让一些数据易于搜索/索引,而实际上这也发生在一些领域,包括UID