php - Silverstripe 数据对象太大,无法使用 MySQL/InnoDB 保存
问题描述
关于使用 PHP7.1、Silverstripe 3.6.0 和 MySQL 的 Web 应用程序的问题。该应用程序托管在 PaaS 提供商上。因此,我没有直接访问数据库的权限,也无法调整 InnoDB,就像错误消息所暗示的那样。
我有一个包含很多字段的自定义DataObject 。它在尝试保存时返回一个奇怪的错误:
无法运行查询:[...此处大更新查询...]行大小太大 (> 8126)。将某些列更改为 TEXT 或 BLOB 或使用 ROW_FORMAT=DYNAMIC 或 ROW_FORMAT=COMPRESSED 可能会有所帮助。在当前行格式中,768 字节的 BLOB 前缀被内联存储。
在这里,您可以找到我的课程的简短版本:
class APIPersonResource extends DataObject {
private static $db = array(
'ResourceID' => 'Int',
'Firstname' => 'Varchar(255)',
'Lastname' => 'Varchar(255)',
'Salutation' => 'Varchar(255)',
'Email' => 'Varchar(255)',
'HomepageLink' => 'Text',
'PhoneNo' => 'Varchar(255)',
'Info' => 'HTMLText',
'IsResponsible' => 'Boolean',
'ResponsibleDescription' => 'Varchar(255)',
'ShortBio' => 'HTMLText',
'RoomNo' => 'Varchar',
'IsActive' => 'Boolean',
'IsAcademic' => 'Boolean',
'HasImage' => 'Boolean',
'HasLinksSection' => 'Boolean',
'HasCv' => 'Boolean',
'HasPublications' => 'Boolean',
'HasOfficeHours' => 'Boolean',
'AreaOfFocus' => 'Varchar(64)',
'OleLink' => 'Text',
'ReserveCollectionLink' => 'Text',
'ResearchAreas' => 'HTMLText',
'APIDepartmentResourceID' => 'Int',
'APIAddressResourceID' => 'Int',
'APIDegreeResourceID' => 'Int'
);
}
ShortBio
, AreaOfFocus
,ResearchAreas
和Info
都是可以变得很长的用户输入字段。奇怪的是,这些字段是类型的HTMLText
,而在数据库表中,列的类型是mediumtext
:
MariaDB [leonixyz]> describe APIPersonResource;
+------------------------------+---------------------------------------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------------------+---------------------------------------------------+------+-----+-------------------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| ClassName | enum('APIPersonResource','APIPhdStudentResource') | YES | MUL | APIPersonResource | |
| LastEdited | datetime | YES | | NULL | |
| Created | datetime | YES | | NULL | |
| Salutation_en_US | varchar(255) | YES | | NULL | |
| Salutation_de_DE | varchar(255) | YES | | NULL | |
| Salutation_it_IT | varchar(255) | YES | | NULL | |
| ResponsibleDescription_en_US | varchar(255) | YES | | NULL | |
| ResponsibleDescription_de_DE | varchar(255) | YES | | NULL | |
| ResponsibleDescription_it_IT | varchar(255) | YES | | NULL | |
| ShortBio_en_US | mediumtext | YES | | NULL | |
| ShortBio_de_DE | mediumtext | YES | | NULL | |
| ShortBio_it_IT | mediumtext | YES | | NULL | |
| ResourceID | int(11) | NO | | 0 | |
| Firstname | varchar(255) | YES | | NULL | |
| Lastname | varchar(255) | YES | | NULL | |
| Salutation | varchar(255) | YES | | NULL | |
| Email | varchar(255) | YES | | NULL | |
| PhoneNo | varchar(255) | YES | | NULL | |
| IsResponsible | tinyint(1) unsigned | NO | | 0 | |
| ResponsibleDescription | varchar(255) | YES | | NULL | |
| ShortBio | mediumtext | YES | | NULL | |
| IsActive | tinyint(1) unsigned | NO | | 0 | |
| HasActiveContract | tinyint(1) unsigned | NO | | 0 | |
| APIDepartmentResourceID | int(11) | NO | | 0 | |
| RoomNo | varchar(50) | YES | | NULL | |
| HasImage | tinyint(1) unsigned | NO | | 0 | |
| HasCv | tinyint(1) unsigned | NO | | 0 | |
| HasPublications | tinyint(1) unsigned | NO | | 0 | |
| APIAddressResourceID | int(11) | NO | | 0 | |
| AreaOfFocus_en_US | varchar(64) | YES | | NULL | |
| AreaOfFocus_de_DE | varchar(64) | YES | | NULL | |
| AreaOfFocus_it_IT | varchar(64) | YES | | NULL | |
| AreaOfFocus | varchar(64) | YES | | NULL | |
| HomepageLink | mediumtext | YES | | NULL | |
| Info_en_US | mediumtext | YES | | NULL | |
| Info_de_DE | mediumtext | YES | | NULL | |
| Info_it_IT | mediumtext | YES | | NULL | |
| ResearchAreas_en_US | mediumtext | YES | | NULL | |
| ResearchAreas_de_DE | mediumtext | YES | | NULL | |
| ResearchAreas_it_IT | mediumtext | YES | | NULL | |
| Info | mediumtext | YES | | NULL | |
| HasLinksSection | tinyint(1) unsigned | NO | | 0 | |
| HasOfficeHours | tinyint(1) unsigned | NO | | 0 | |
| OleLink | mediumtext | YES | | NULL | |
| ReserveCollectionLink | mediumtext | YES | | NULL | |
| ResearchAreas | mediumtext | YES | | NULL | |
| APIDegreeResourceID | int(11) | NO | | 0 | |
| IsAcademic | tinyint(1) unsigned | NO | | 0 | |
+------------------------------+---------------------------------------------------+------+-----+-------------------+----------------+
有没有办法在不将我的对象分成几部分的情况下解决这个问题?
提前致谢
解决方案
您应该重构您的模型(例如,使用 1:1 关系has_one
和belongs_to
),或者将 RowFormat 设置为压缩。这可以使用此代码为每个 DataObject 完成(来自 SS3,但也应该在 SS4 上工作):
private static $create_table_options = array(
'MySQLDatabase' => 'ENGINE=InnoDB ROW_FORMAT=COMPRESSED'
);
推荐阅读
- kubernetes - 如何使用 watch api 避免丢失历史删除事件
- vispy - 同一视图中的多个图像
- ios - 在运行时使用 NSLocalizedString 从所选语言快速获取字符串
- image - modx : MOD Xupdate 后无法上传图片或文件
- scala - 可以通过 ISNUMERIC 函数过滤 Spark 数据帧吗?
- express - Express Gateway:'警告:无法验证第一个证书' Express.js
- python - Python 混合整数优化
- javascript - 检查是否有一个类并且代码是否出现 // 防止删除一个类
- mysql - 列上等于两列之一的 SQL JOIN
- linux - 无法在 Arch Linux 上安装 libc++