X-Git-Url: https://git.cyclocoop.org/%27.WWW_URL.%27admin/?a=blobdiff_plain;f=maintenance%2Ftables.sql;h=b881d7e0f1ac9eb28f2d26c3c2c6ed86b098a09f;hb=9ba178b8aa3aa93a5bba1d09cfa85527e8edfa8f;hp=1497d6fc239c5faa3d0794029df0f3bf170a1382;hpb=d6276525455e6a00fffc90229ef81a1fc8feaa25;p=lhc%2Fweb%2Fwiklou.git diff --git a/maintenance/tables.sql b/maintenance/tables.sql index 1497d6fc23..b881d7e0f1 100644 --- a/maintenance/tables.sql +++ b/maintenance/tables.sql @@ -178,11 +178,10 @@ CREATE INDEX /*i*/ug_expiry ON /*_*/user_groups (ug_expiry); CREATE TABLE /*_*/user_former_groups ( -- Key to user_id ufg_user int unsigned NOT NULL default 0, - ufg_group varbinary(255) NOT NULL default '' + ufg_group varbinary(255) NOT NULL default '', + PRIMARY KEY (ufg_user,ufg_group) ) /*$wgDBTableOptions*/; -CREATE UNIQUE INDEX /*i*/ufg_user_group ON /*_*/user_former_groups (ufg_user,ufg_group); - -- -- Stores notifications of user talk page changes, for the display -- of the "you have new messages" box @@ -214,16 +213,16 @@ CREATE INDEX /*i*/un_user_ip ON /*_*/user_newtalk (user_ip); -- CREATE TABLE /*_*/user_properties ( -- Foreign key to user.user_id - up_user int NOT NULL, + up_user int unsigned NOT NULL, -- Name of the option being saved. This is indexed for bulk lookup. up_property varbinary(255) NOT NULL, -- Property value as a string. - up_value blob + up_value blob, + PRIMARY KEY (up_user,up_property) ) /*$wgDBTableOptions*/; -CREATE UNIQUE INDEX /*i*/user_properties_user_property ON /*_*/user_properties (up_user,up_property); CREATE INDEX /*i*/user_properties_property ON /*_*/user_properties (up_property); -- @@ -232,7 +231,7 @@ CREATE INDEX /*i*/user_properties_property ON /*_*/user_properties (up_property) -- CREATE TABLE /*_*/bot_passwords ( -- User ID obtained from CentralIdLookup. - bp_user int NOT NULL, + bp_user int unsigned NOT NULL, -- Application identifier bp_app_id varbinary(32) NOT NULL, @@ -346,10 +345,9 @@ CREATE TABLE /*_*/revision ( -- or a rollback to a previous version. rev_text_id int unsigned NOT NULL, - -- Text comment summarizing the change. - -- This text is shown in the history and other changes lists, - -- rendered in a subset of wiki markup by Linker::formatComment() - rev_comment varbinary(767) NOT NULL, + -- Text comment summarizing the change. Deprecated in favor of + -- revision_comment_temp.revcomment_comment_id. + rev_comment varbinary(767) NOT NULL default '', -- Key to user.user_id of the user who made this edit. -- Stores 0 for anonymous edits and for some mass imports. @@ -410,6 +408,23 @@ CREATE INDEX /*i*/usertext_timestamp ON /*_*/revision (rev_user_text,rev_timesta -- and is a logged-in user. CREATE INDEX /*i*/page_user_timestamp ON /*_*/revision (rev_page,rev_user,rev_timestamp); +-- +-- Temporary table to avoid blocking on an alter of revision. +-- +-- On large wikis like the English Wikipedia, altering the revision table is a +-- months-long process. This table is being created to avoid such an alter, and +-- will be merged back into revision in the future. +-- +CREATE TABLE /*_*/revision_comment_temp ( + -- Key to rev_id + revcomment_rev int unsigned NOT NULL, + -- Key to comment_id + revcomment_comment_id bigint unsigned NOT NULL, + PRIMARY KEY (revcomment_rev, revcomment_comment_id) +) /*$wgDBTableOptions*/; +-- Ensure uniqueness +CREATE UNIQUE INDEX /*i*/revcomment_rev ON /*_*/revision_comment_temp (revcomment_rev); + -- -- Every time an edit by a logged out user is saved, -- a row is created in ip_changes. This stores @@ -475,6 +490,40 @@ CREATE TABLE /*_*/text ( -- In case tables are created as MyISAM, use row hints for MySQL <5.0 to avoid 4GB limit +-- +-- Edits, blocks, and other actions typically have a textual comment describing +-- the action. They are stored here to reduce the size of the main tables, and +-- to allow for deduplication. +-- +-- Deduplication is currently best-effort to avoid locking on inserts that +-- would be required for strict deduplication. There MAY be multiple rows with +-- the same comment_text and comment_data. +-- +CREATE TABLE /*_*/comment ( + -- Unique ID to identify each comment + comment_id bigint unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, + + -- Hash of comment_text and comment_data, for deduplication + comment_hash INT NOT NULL, + + -- Text comment summarizing the change. + -- This text is shown in the history and other changes lists, + -- rendered in a subset of wiki markup by Linker::formatComment() + -- Size limits are enforced at the application level, and should + -- take care to crop UTF-8 strings appropriately. + comment_text BLOB NOT NULL, + + -- JSON data, intended for localizing auto-generated comments. + -- This holds structured data that is intended to be used to provide + -- localized versions of automatically-generated comments. When not empty, + -- comment_text should be the generated comment localized using the wiki's + -- content language. + comment_data BLOB +) /*$wgDBTableOptions*/; +-- Index used for deduplication. +CREATE INDEX /*i*/comment_hash ON /*_*/comment (comment_hash); + + -- -- Holding area for deleted articles, which may be viewed -- or restored by admins through the Special:Undelete interface. @@ -496,7 +545,8 @@ CREATE TABLE /*_*/archive ( ar_text mediumblob NOT NULL, -- Basic revision stuff... - ar_comment varbinary(767) NOT NULL, + ar_comment varbinary(767) NOT NULL default '', -- Deprecated in favor of ar_comment_id + ar_comment_id bigint unsigned NOT NULL DEFAULT 0, -- ("DEFAULT 0" is temporary, signaling that ar_comment should be used) ar_user int unsigned NOT NULL default 0, ar_user_text varchar(255) binary NOT NULL, ar_timestamp binary(14) NOT NULL default '', @@ -561,6 +611,74 @@ CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timesta -- rows, such as change_tag. CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id); +-- +-- Slots represent an n:m relation between revisions and content objects. +-- A content object can have a specific "role" in one or more revisions. +-- Each revision can have multiple content objects, each having a different role. +-- +CREATE TABLE /*_*/slots ( + + -- reference to rev_id + slot_revision_id bigint unsigned NOT NULL, + + -- reference to role_id + slot_role_id smallint unsigned NOT NULL, + + -- reference to content_id + slot_content_id bigint unsigned NOT NULL, + + -- whether the content is inherited (1) or new in this revision (0) + slot_inherited tinyint unsigned NOT NULL DEFAULT 0, + + PRIMARY KEY ( slot_revision_id, slot_role_id ) +) /*$wgDBTableOptions*/; + +-- Index for finding revisions that modified a specific slot +CREATE INDEX /*i*/slot_role_inherited ON /*_*/slots (slot_revision_id, slot_role_id, slot_inherited); + +-- +-- The content table represents content objects. It's primary purpose is to provide the necessary +-- meta-data for loading and interpreting a serialized data blob to create a content object. +-- +CREATE TABLE /*_*/content ( + + -- ID of the content object + content_id bigint unsigned PRIMARY KEY AUTO_INCREMENT, + + -- Nominal size of the content object (not necessarily of the serialized blob) + content_size int unsigned NOT NULL, + + -- Nominal hash of the content object (not necessarily of the serialized blob) + content_sha1 varbinary(32) NOT NULL, + + -- reference to model_id + content_model smallint unsigned NOT NULL, + + -- URL-like address of the content blob + content_address varbinary(255) NOT NULL +) /*$wgDBTableOptions*/; + +-- +-- Normalization table for role names +-- +CREATE TABLE /*_*/slot_roles ( + role_id smallint PRIMARY KEY AUTO_INCREMENT, + role_name varbinary(64) NOT NULL +) /*$wgDBTableOptions*/; + +-- Index for looking of the internal ID of for a name +CREATE UNIQUE INDEX /*i*/role_name ON /*_*/slot_roles (role_name); + +-- +-- Normalization table for content model names +-- +CREATE TABLE /*_*/content_models ( + model_id smallint PRIMARY KEY AUTO_INCREMENT, + model_name varbinary(64) NOT NULL +) /*$wgDBTableOptions*/; + +-- Index for looking of the internal ID of for a name +CREATE UNIQUE INDEX /*i*/model_name ON /*_*/content_models (model_name); -- -- Track page-to-page hyperlinks within the wiki. @@ -576,12 +694,10 @@ CREATE TABLE /*_*/pagelinks ( -- and deletions may refer to different page records as time -- goes by. pl_namespace int NOT NULL default 0, - pl_title varchar(255) binary NOT NULL default '' + pl_title varchar(255) binary NOT NULL default '', + PRIMARY KEY (pl_from,pl_namespace,pl_title) ) /*$wgDBTableOptions*/; --- Forward index, for page edit, save -CREATE UNIQUE INDEX /*i*/pl_from ON /*_*/pagelinks (pl_from,pl_namespace,pl_title); - -- Reverse index, for Special:Whatlinkshere CREATE INDEX /*i*/pl_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from); @@ -603,12 +719,10 @@ CREATE TABLE /*_*/templatelinks ( -- and deletions may refer to different page records as time -- goes by. tl_namespace int NOT NULL default 0, - tl_title varchar(255) binary NOT NULL default '' + tl_title varchar(255) binary NOT NULL default '', + PRIMARY KEY (tl_from,tl_namespace,tl_title) ) /*$wgDBTableOptions*/; --- Forward index, for page edit, save -CREATE UNIQUE INDEX /*i*/tl_from ON /*_*/templatelinks (tl_from,tl_namespace,tl_title); - -- Reverse index, for Special:Whatlinkshere CREATE INDEX /*i*/tl_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from); @@ -630,12 +744,10 @@ CREATE TABLE /*_*/imagelinks ( -- Filename of target image. -- This is also the page_title of the file's description page; -- all such pages are in namespace 6 (NS_FILE). - il_to varchar(255) binary NOT NULL default '' + il_to varchar(255) binary NOT NULL default '', + PRIMARY KEY (il_from,il_to) ) /*$wgDBTableOptions*/; --- Forward index, for cache invalidation on file update, etc. -CREATE UNIQUE INDEX /*i*/il_from ON /*_*/imagelinks (il_from,il_to); - -- Reverse index, for Special:Whatlinkshere and file description page local usage CREATE INDEX /*i*/il_to ON /*_*/imagelinks (il_to,il_from); @@ -685,10 +797,10 @@ CREATE TABLE /*_*/categorylinks ( -- paginate the three categories separately. This never has to be updated -- after the page is created, since none of these page types can be moved to -- any other. - cl_type ENUM('page', 'subcat', 'file') NOT NULL default 'page' + cl_type ENUM('page', 'subcat', 'file') NOT NULL default 'page', + PRIMARY KEY (cl_from,cl_to) ) /*$wgDBTableOptions*/; -CREATE UNIQUE INDEX /*i*/cl_from ON /*_*/categorylinks (cl_from,cl_to); -- We always sort within a given category, and within a given type. FIXME: -- Formerly this index didn't cover cl_type (since that didn't exist), so old @@ -787,12 +899,10 @@ CREATE TABLE /*_*/langlinks ( ll_lang varbinary(20) NOT NULL default '', -- Title of the target, including namespace - ll_title varchar(255) binary NOT NULL default '' + ll_title varchar(255) binary NOT NULL default '', + PRIMARY KEY (ll_from,ll_lang) ) /*$wgDBTableOptions*/; --- Forward index, for page edit, save, ApiQueryLanglinks -CREATE UNIQUE INDEX /*i*/ll_from ON /*_*/langlinks (ll_from, ll_lang); - -- Index for ApiQueryLangbacklinks CREATE INDEX /*i*/ll_lang ON /*_*/langlinks (ll_lang, ll_title); @@ -808,12 +918,10 @@ CREATE TABLE /*_*/iwlinks ( iwl_prefix varbinary(20) NOT NULL default '', -- Title of the target, including namespace - iwl_title varchar(255) binary NOT NULL default '' + iwl_title varchar(255) binary NOT NULL default '', + PRIMARY KEY (iwl_from,iwl_prefix,iwl_title) ) /*$wgDBTableOptions*/; --- Forward index, for page edit, save, ApiQueryIWLinks -CREATE UNIQUE INDEX /*i*/iwl_from ON /*_*/iwlinks (iwl_from, iwl_prefix, iwl_title); - -- Index for ApiQueryIWBacklinks CREATE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from); @@ -827,7 +935,7 @@ CREATE INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, i -- CREATE TABLE /*_*/site_stats ( -- The single row should contain 1 here. - ss_row_id int unsigned NOT NULL, + ss_row_id int unsigned NOT NULL PRIMARY KEY, -- Total number of edits performed. ss_total_edits bigint unsigned default 0, @@ -852,9 +960,6 @@ CREATE TABLE /*_*/site_stats ( ss_images int default 0 ) /*$wgDBTableOptions*/; --- Pointless index to assuage developer superstitions -CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id); - -- -- The internet is full of jerks, alas. Sometimes it's handy -- to block a vandal or troll account. @@ -875,8 +980,12 @@ CREATE TABLE /*_*/ipblocks ( -- User name of blocker ipb_by_text varchar(255) binary NOT NULL default '', - -- Text comment made by blocker. - ipb_reason varbinary(767) NOT NULL, + -- Text comment made by blocker. Deprecated in favor of ipb_reason_id + ipb_reason varbinary(767) NOT NULL default '', + + -- Key to comment_id. Text comment made by blocker. + -- ("DEFAULT 0" is temporary, signaling that ipb_reason should be used) + ipb_reason_id bigint unsigned NOT NULL DEFAULT 0, -- Creation (or refresh) date in standard YMDHMS form. -- IP blocks expire automatically. @@ -983,7 +1092,8 @@ CREATE TABLE /*_*/image ( -- Description field as entered by the uploader. -- This is displayed in image upload history and logs. - img_description varbinary(767) NOT NULL, + -- Deprecated in favor of image_comment_temp.imgcomment_description_id. + img_description varbinary(767) NOT NULL default '', -- user_id and user_name of uploader. img_user int unsigned NOT NULL default 0, @@ -1008,6 +1118,23 @@ CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1(10)); -- Used to get media of one type CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime); +-- +-- Temporary table to avoid blocking on an alter of image. +-- +-- On large wikis like Wikimedia Commons, altering the image table is a +-- months-long process. This table is being created to avoid such an alter, and +-- will be merged back into image in the future. +-- +CREATE TABLE /*_*/image_comment_temp ( + -- Key to img_name (ugh) + imgcomment_name varchar(255) binary NOT NULL, + -- Key to comment_id + imgcomment_description_id bigint unsigned NOT NULL, + PRIMARY KEY (imgcomment_name, imgcomment_description_id) +) /*$wgDBTableOptions*/; +-- Ensure uniqueness +CREATE UNIQUE INDEX /*i*/imgcomment_name ON /*_*/image_comment_temp (imgcomment_name); + -- -- Previous revisions of uploaded files. @@ -1027,7 +1154,8 @@ CREATE TABLE /*_*/oldimage ( oi_width int NOT NULL default 0, oi_height int NOT NULL default 0, oi_bits int NOT NULL default 0, - oi_description varbinary(767) NOT NULL, + oi_description varbinary(767) NOT NULL default '', -- Deprecated. + oi_description_id bigint unsigned NOT NULL DEFAULT 0, -- ("DEFAULT 0" is temporary, signaling that oi_description should be used) oi_user int unsigned NOT NULL default 0, oi_user_text varchar(255) binary NOT NULL, oi_timestamp binary(14) NOT NULL default '', @@ -1075,7 +1203,8 @@ CREATE TABLE /*_*/filearchive ( -- Deletion information, if this file is deleted. fa_deleted_user int, fa_deleted_timestamp binary(14) default '', - fa_deleted_reason varbinary(767) default '', + fa_deleted_reason varbinary(767) default '', -- Deprecated + fa_deleted_reason_id bigint unsigned NOT NULL DEFAULT 0, -- ("DEFAULT 0" is temporary, signaling that fa_deleted_reason should be used) -- Duped fields from image fa_size int unsigned default 0, @@ -1086,7 +1215,8 @@ CREATE TABLE /*_*/filearchive ( fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL, fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") default "unknown", fa_minor_mime varbinary(100) default "unknown", - fa_description varbinary(767), + fa_description varbinary(767) default '', -- Deprecated + fa_description_id bigint unsigned NOT NULL DEFAULT 0, -- ("DEFAULT 0" is temporary, signaling that fa_description should be used) fa_user int unsigned default 0, fa_user_text varchar(255) binary, fa_timestamp binary(14) default '', @@ -1184,7 +1314,8 @@ CREATE TABLE /*_*/recentchanges ( rc_title varchar(255) binary NOT NULL default '', -- as in revision... - rc_comment varbinary(767) NOT NULL default '', + rc_comment varbinary(767) NOT NULL default '', -- Deprecated. + rc_comment_id bigint unsigned NOT NULL DEFAULT 0, -- ("DEFAULT 0" is temporary, signaling that rc_comment should be used) rc_minor tinyint unsigned NOT NULL default 0, -- Edits by user accounts with the 'bot' rights key are @@ -1381,13 +1512,11 @@ CREATE INDEX /*i*/exptime ON /*_*/objectcache (exptime); -- Cache of interwiki transclusion -- CREATE TABLE /*_*/transcache ( - tc_url varbinary(255) NOT NULL, + tc_url varbinary(255) NOT NULL PRIMARY KEY, tc_contents text, tc_time binary(14) NOT NULL ) /*$wgDBTableOptions*/; -CREATE UNIQUE INDEX /*i*/tc_url_idx ON /*_*/transcache (tc_url); - CREATE TABLE /*_*/logging ( -- Log ID, for referring to this specific log entry, probably for deletion and such. @@ -1415,8 +1544,13 @@ CREATE TABLE /*_*/logging ( log_page int unsigned NULL, -- Freeform text. Interpreted as edit history comments. + -- Deprecated in favor of log_comment_id. log_comment varbinary(767) NOT NULL default '', + -- Key to comment_id. Comment summarizing the change. + -- ("DEFAULT 0" is temporary, signaling that log_comment should be used) + log_comment_id bigint unsigned NOT NULL DEFAULT 0, + -- miscellaneous parameters: -- LF separated list (old system) or serialized PHP array (new system) log_params blob NOT NULL, @@ -1460,9 +1594,9 @@ CREATE TABLE /*_*/log_search ( -- The value of the ID ls_value varchar(255) NOT NULL, -- Key to log_id - ls_log_id int unsigned NOT NULL default 0 + ls_log_id int unsigned NOT NULL default 0, + PRIMARY KEY (ls_field,ls_value,ls_log_id) ) /*$wgDBTableOptions*/; -CREATE UNIQUE INDEX /*i*/ls_field_val ON /*_*/log_search (ls_field,ls_value,ls_log_id); CREATE INDEX /*i*/ls_log_id ON /*_*/log_search (ls_log_id); @@ -1514,14 +1648,12 @@ CREATE INDEX /*i*/job_timestamp ON /*_*/job (job_timestamp); CREATE TABLE /*_*/querycache_info ( -- Special page name -- Corresponds to a qc_type value - qci_type varbinary(32) NOT NULL default '', + qci_type varbinary(32) NOT NULL default '' PRIMARY KEY, -- Timestamp of last update qci_timestamp binary(14) NOT NULL default '19700101000000' ) /*$wgDBTableOptions*/; -CREATE UNIQUE INDEX /*i*/qci_type ON /*_*/querycache_info (qci_type); - -- For each redirect, this table contains exactly one row defining its target CREATE TABLE /*_*/redirect ( @@ -1576,7 +1708,7 @@ CREATE TABLE /*_*/page_restrictions ( -- Whether or not to cascade the protection down to pages transcluded. pr_cascade tinyint NOT NULL, -- Field for future support of per-user restriction. - pr_user int NULL, + pr_user int unsigned NULL, -- Field for time-limited protection. pr_expiry varbinary(14) NULL ) /*$wgDBTableOptions*/; @@ -1592,7 +1724,8 @@ CREATE TABLE /*_*/protected_titles ( pt_namespace int NOT NULL, pt_title varchar(255) binary NOT NULL, pt_user int unsigned NOT NULL, - pt_reason varbinary(767), + pt_reason varbinary(767) default '', -- Deprecated. + pt_reason_id bigint unsigned NOT NULL DEFAULT 0, -- ("DEFAULT 0" is temporary, signaling that pt_reason should be used) pt_timestamp binary(14) NOT NULL, pt_expiry varbinary(14) NOT NULL default '', pt_create_perm varbinary(60) NOT NULL @@ -1627,9 +1760,9 @@ CREATE TABLE /*_*/change_tag ( -- RCID for the change ct_rc_id int NULL, -- LOGID for the change - ct_log_id int NULL, + ct_log_id int unsigned NULL, -- REVID for the change - ct_rev_id int NULL, + ct_rev_id int unsigned NULL, -- Tag applied ct_tag varchar(255) NOT NULL, -- Parameters for the tag, presently unused @@ -1650,9 +1783,9 @@ CREATE TABLE /*_*/tag_summary ( -- RCID for the change ts_rc_id int NULL, -- LOGID for the change - ts_log_id int NULL, + ts_log_id int unsigned NULL, -- REVID for the change - ts_rev_id int NULL, + ts_rev_id int unsigned NULL, -- Comma-separated list of tags ts_tags blob NOT NULL ) /*$wgDBTableOptions*/; @@ -1673,9 +1806,9 @@ CREATE TABLE /*_*/l10n_cache ( -- Cache key lc_key varchar(255) NOT NULL, -- Value - lc_value mediumblob NOT NULL + lc_value mediumblob NOT NULL, + PRIMARY KEY (lc_lang, lc_key) ) /*$wgDBTableOptions*/; -CREATE INDEX /*i*/lc_lang_key ON /*_*/l10n_cache (lc_lang, lc_key); -- Table caching which local files a module depends on that aren't -- registered directly, used for fast retrieval of file dependency. @@ -1686,9 +1819,9 @@ CREATE TABLE /*_*/module_deps ( -- Module context vary (includes skin and language; called "md_skin" for legacy reasons) md_skin varbinary(32) NOT NULL, -- JSON blob with file dependencies - md_deps mediumblob NOT NULL + md_deps mediumblob NOT NULL, + PRIMARY KEY (md_module,md_skin) ) /*$wgDBTableOptions*/; -CREATE UNIQUE INDEX /*i*/md_module_skin ON /*_*/module_deps (md_module, md_skin); -- Holds all the sites known to the wiki. CREATE TABLE /*_*/sites (