]> git.mxchange.org Git - friendica.git/blobdiff - database.sql
Merge pull request #9408 from annando/announce
[friendica.git] / database.sql
index e1a8f7fe7c80e9b0b2b31fc0fbf03d580fd9de88..1e439213d4b46c27b6dfdd63954e22a8dc20239e 100644 (file)
@@ -1,6 +1,6 @@
 -- ------------------------------------------
--- Friendica 2020.09-dev (Red Hot Poker)
--- DB_UPDATE_VERSION 1361
+-- Friendica 2020.12-dev (Red Hot Poker)
+-- DB_UPDATE_VERSION 1370
 -- ------------------------------------------
 
 
@@ -33,19 +33,6 @@ CREATE TABLE IF NOT EXISTS `gserver` (
         UNIQUE INDEX `nurl` (`nurl`(190))
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Global servers';
 
---
--- TABLE clients
---
-CREATE TABLE IF NOT EXISTS `clients` (
-       `client_id` varchar(20) NOT NULL COMMENT '',
-       `pw` varchar(20) NOT NULL DEFAULT '' COMMENT '',
-       `redirect_uri` varchar(200) NOT NULL DEFAULT '' COMMENT '',
-       `name` text COMMENT '',
-       `icon` text COMMENT '',
-       `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
-        PRIMARY KEY(`client_id`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='OAuth usage';
-
 --
 -- TABLE contact
 --
@@ -111,6 +98,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
        `forum` boolean NOT NULL DEFAULT '0' COMMENT 'contact is a forum',
        `prv` boolean NOT NULL DEFAULT '0' COMMENT 'contact is a private group',
        `contact-type` tinyint NOT NULL DEFAULT 0 COMMENT '',
+       `manually-approve` boolean COMMENT '',
        `hidden` boolean NOT NULL DEFAULT '0' COMMENT '',
        `archive` boolean NOT NULL DEFAULT '0' COMMENT '',
        `pending` boolean NOT NULL DEFAULT '1' COMMENT '',
@@ -162,6 +150,86 @@ CREATE TABLE IF NOT EXISTS `item-uri` (
         INDEX `guid` (`guid`)
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='URI and GUID for items';
 
+--
+-- TABLE tag
+--
+CREATE TABLE IF NOT EXISTS `tag` (
+       `id` int unsigned NOT NULL auto_increment COMMENT '',
+       `name` varchar(96) NOT NULL DEFAULT '' COMMENT '',
+       `url` varbinary(255) NOT NULL DEFAULT '' COMMENT '',
+        PRIMARY KEY(`id`),
+        UNIQUE INDEX `type_name_url` (`name`,`url`),
+        INDEX `url` (`url`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='tags and mentions';
+
+--
+-- TABLE user
+--
+CREATE TABLE IF NOT EXISTS `user` (
+       `uid` mediumint unsigned NOT NULL auto_increment COMMENT 'sequential ID',
+       `parent-uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'The parent user that has full control about this user',
+       `guid` varchar(64) NOT NULL DEFAULT '' COMMENT 'A unique identifier for this user',
+       `username` varchar(255) NOT NULL DEFAULT '' COMMENT 'Name that this user is known by',
+       `password` varchar(255) NOT NULL DEFAULT '' COMMENT 'encrypted password',
+       `legacy_password` boolean NOT NULL DEFAULT '0' COMMENT 'Is the password hash double-hashed?',
+       `nickname` varchar(255) NOT NULL DEFAULT '' COMMENT 'nick- and user name',
+       `email` varchar(255) NOT NULL DEFAULT '' COMMENT 'the users email address',
+       `openid` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+       `timezone` varchar(128) NOT NULL DEFAULT '' COMMENT 'PHP-legal timezone',
+       `language` varchar(32) NOT NULL DEFAULT 'en' COMMENT 'default language',
+       `register_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp of registration',
+       `login_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp of last login',
+       `default-location` varchar(255) NOT NULL DEFAULT '' COMMENT 'Default for item.location',
+       `allow_location` boolean NOT NULL DEFAULT '0' COMMENT '1 allows to display the location',
+       `theme` varchar(255) NOT NULL DEFAULT '' COMMENT 'user theme preference',
+       `pubkey` text COMMENT 'RSA public key 4096 bit',
+       `prvkey` text COMMENT 'RSA private key 4096 bit',
+       `spubkey` text COMMENT '',
+       `sprvkey` text COMMENT '',
+       `verified` boolean NOT NULL DEFAULT '0' COMMENT 'user is verified through email',
+       `blocked` boolean NOT NULL DEFAULT '0' COMMENT '1 for user is blocked',
+       `blockwall` boolean NOT NULL DEFAULT '0' COMMENT 'Prohibit contacts to post to the profile page of the user',
+       `hidewall` boolean NOT NULL DEFAULT '0' COMMENT 'Hide profile details from unkown viewers',
+       `blocktags` boolean NOT NULL DEFAULT '0' COMMENT 'Prohibit contacts to tag the post of this user',
+       `unkmail` boolean NOT NULL DEFAULT '0' COMMENT 'Permit unknown people to send private mails to this user',
+       `cntunkmail` int unsigned NOT NULL DEFAULT 10 COMMENT '',
+       `notify-flags` smallint unsigned NOT NULL DEFAULT 65535 COMMENT 'email notification options',
+       `page-flags` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'page/profile type',
+       `account-type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
+       `prvnets` boolean NOT NULL DEFAULT '0' COMMENT '',
+       `pwdreset` varchar(255) COMMENT 'Password reset request token',
+       `pwdreset_time` datetime COMMENT 'Timestamp of the last password reset request',
+       `maxreq` int unsigned NOT NULL DEFAULT 10 COMMENT '',
+       `expire` int unsigned NOT NULL DEFAULT 0 COMMENT '',
+       `account_removed` boolean NOT NULL DEFAULT '0' COMMENT 'if 1 the account is removed',
+       `account_expired` boolean NOT NULL DEFAULT '0' COMMENT '',
+       `account_expires_on` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp when account expires and will be deleted',
+       `expire_notification_sent` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp of last warning of account expiration',
+       `def_gid` int unsigned NOT NULL DEFAULT 0 COMMENT '',
+       `allow_cid` mediumtext COMMENT 'default permission for this user',
+       `allow_gid` mediumtext COMMENT 'default permission for this user',
+       `deny_cid` mediumtext COMMENT 'default permission for this user',
+       `deny_gid` mediumtext COMMENT 'default permission for this user',
+       `openidserver` text COMMENT '',
+        PRIMARY KEY(`uid`),
+        INDEX `nickname` (`nickname`(32))
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='The local users';
+
+--
+-- TABLE clients
+--
+CREATE TABLE IF NOT EXISTS `clients` (
+       `client_id` varchar(20) NOT NULL COMMENT '',
+       `pw` varchar(20) NOT NULL DEFAULT '' COMMENT '',
+       `redirect_uri` varchar(200) NOT NULL DEFAULT '' COMMENT '',
+       `name` text COMMENT '',
+       `icon` text COMMENT '',
+       `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
+        PRIMARY KEY(`client_id`),
+        INDEX `uid` (`uid`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='OAuth usage';
+
 --
 -- TABLE permissionset
 --
@@ -176,18 +244,6 @@ CREATE TABLE IF NOT EXISTS `permissionset` (
         INDEX `uid_allow_cid_allow_gid_deny_cid_deny_gid` (`allow_cid`(50),`allow_gid`(30),`deny_cid`(50),`deny_gid`(30))
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='';
 
---
--- TABLE tag
---
-CREATE TABLE IF NOT EXISTS `tag` (
-       `id` int unsigned NOT NULL auto_increment COMMENT '',
-       `name` varchar(96) NOT NULL DEFAULT '' COMMENT '',
-       `url` varbinary(255) NOT NULL DEFAULT '' COMMENT '',
-        PRIMARY KEY(`id`),
-        UNIQUE INDEX `type_name_url` (`name`,`url`),
-        INDEX `url` (`url`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='tags and mentions';
-
 --
 -- TABLE 2fa_app_specific_password
 --
@@ -199,7 +255,8 @@ CREATE TABLE IF NOT EXISTS `2fa_app_specific_password` (
        `generated` datetime NOT NULL COMMENT 'Datetime the password was generated',
        `last_used` datetime COMMENT 'Datetime the password was last used',
         PRIMARY KEY(`id`),
-        INDEX `uid_description` (`uid`,`description`(190))
+        INDEX `uid_description` (`uid`,`description`(190)),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Two-factor app-specific _password';
 
 --
@@ -210,7 +267,8 @@ CREATE TABLE IF NOT EXISTS `2fa_recovery_codes` (
        `code` varchar(50) NOT NULL COMMENT 'Recovery code string',
        `generated` datetime NOT NULL COMMENT 'Datetime the code was generated',
        `used` datetime COMMENT 'Datetime the code was used',
-        PRIMARY KEY(`uid`,`code`)
+        PRIMARY KEY(`uid`,`code`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Two-factor authentication recovery codes';
 
 --
@@ -284,7 +342,9 @@ CREATE TABLE IF NOT EXISTS `attach` (
        `deny_gid` mediumtext COMMENT 'Access Control - list of denied groups',
        `backend-class` tinytext COMMENT 'Storage backend class',
        `backend-ref` text COMMENT 'Storage backend data reference',
-        PRIMARY KEY(`id`)
+        PRIMARY KEY(`id`),
+        INDEX `uid` (`uid`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='file attachments';
 
 --
@@ -366,7 +426,8 @@ CREATE TABLE IF NOT EXISTS `conv` (
        `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'edited timestamp',
        `subject` text COMMENT 'subject of initial message',
         PRIMARY KEY(`id`),
-        INDEX `uid` (`uid`)
+        INDEX `uid` (`uid`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='private messages';
 
 --
@@ -421,7 +482,9 @@ CREATE TABLE IF NOT EXISTS `event` (
        `deny_cid` mediumtext COMMENT 'Access Control - list of denied contact.id',
        `deny_gid` mediumtext COMMENT 'Access Control - list of denied groups',
         PRIMARY KEY(`id`),
-        INDEX `uid_start` (`uid`,`start`)
+        INDEX `uid_start` (`uid`,`start`),
+        INDEX `cid` (`cid`),
+       FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Events';
 
 --
@@ -463,7 +526,11 @@ CREATE TABLE IF NOT EXISTS `fsuggest` (
        `photo` varchar(255) NOT NULL DEFAULT '' COMMENT '',
        `note` text COMMENT '',
        `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
-        PRIMARY KEY(`id`)
+        PRIMARY KEY(`id`),
+        INDEX `cid` (`cid`),
+        INDEX `uid` (`uid`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+       FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='friend suggestion stuff';
 
 --
@@ -476,7 +543,8 @@ CREATE TABLE IF NOT EXISTS `group` (
        `deleted` boolean NOT NULL DEFAULT '0' COMMENT '1 indicates the group has been deleted',
        `name` varchar(255) NOT NULL DEFAULT '' COMMENT 'human readable name of group',
         PRIMARY KEY(`id`),
-        INDEX `uid` (`uid`)
+        INDEX `uid` (`uid`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='privacy groups, group info';
 
 --
@@ -488,7 +556,9 @@ CREATE TABLE IF NOT EXISTS `group_member` (
        `contact-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'contact.id of the member assigned to the associated group',
         PRIMARY KEY(`id`),
         INDEX `contactid` (`contact-id`),
-        UNIQUE INDEX `gid_contactid` (`gid`,`contact-id`)
+        UNIQUE INDEX `gid_contactid` (`gid`,`contact-id`),
+       FOREIGN KEY (`gid`) REFERENCES `group` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+       FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='privacy groups, member info';
 
 --
@@ -498,7 +568,8 @@ CREATE TABLE IF NOT EXISTS `gserver-tag` (
        `gserver-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'The id of the gserver',
        `tag` varchar(100) NOT NULL DEFAULT '' COMMENT 'Tag that the server has subscribed',
         PRIMARY KEY(`gserver-id`,`tag`),
-        INDEX `tag` (`tag`)
+        INDEX `tag` (`tag`),
+       FOREIGN KEY (`gserver-id`) REFERENCES `gserver` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Tags that the server has subscribed';
 
 --
@@ -514,6 +585,16 @@ CREATE TABLE IF NOT EXISTS `hook` (
         UNIQUE INDEX `hook_file_function` (`hook`,`file`,`function`)
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='addon hook registry';
 
+--
+-- TABLE host
+--
+CREATE TABLE IF NOT EXISTS `host` (
+       `id` tinyint unsigned NOT NULL auto_increment COMMENT 'sequential ID',
+       `name` varchar(128) NOT NULL DEFAULT '' COMMENT 'The hostname',
+        PRIMARY KEY(`id`),
+        UNIQUE INDEX `name` (`name`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Hostname';
+
 --
 -- TABLE inbox-status
 --
@@ -543,7 +624,11 @@ CREATE TABLE IF NOT EXISTS `intro` (
        `datetime` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
        `blocked` boolean NOT NULL DEFAULT '1' COMMENT '',
        `ignore` boolean NOT NULL DEFAULT '0' COMMENT '',
-        PRIMARY KEY(`id`)
+        PRIMARY KEY(`id`),
+        INDEX `contact-id` (`contact-id`),
+        INDEX `uid` (`uid`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+       FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='';
 
 --
@@ -569,6 +654,7 @@ CREATE TABLE IF NOT EXISTS `item` (
        `network` char(4) NOT NULL DEFAULT '' COMMENT 'Network from where the item comes from',
        `owner-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'Link to the contact table with uid=0 of the owner of this item',
        `author-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'Link to the contact table with uid=0 of the author of this item',
+       `causer-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'Link to the contact table with uid=0 of the contact that caused the item creation',
        `icid` int unsigned COMMENT 'Id of the item-content table entry that contains the whole item content',
        `iaid` int unsigned COMMENT 'Id of the item-activity table entry that contains the activity data',
        `vid` smallint unsigned COMMENT 'Id of the verb table entry that contains the activity verbs',
@@ -654,9 +740,11 @@ CREATE TABLE IF NOT EXISTS `item` (
         INDEX `uri-id` (`uri-id`),
         INDEX `parent-uri-id` (`parent-uri-id`),
         INDEX `thr-parent-id` (`thr-parent-id`),
+        INDEX `causer-id` (`causer-id`),
        FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
        FOREIGN KEY (`parent-uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
        FOREIGN KEY (`thr-parent-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+       FOREIGN KEY (`causer-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT,
        FOREIGN KEY (`psid`) REFERENCES `permissionset` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Structure for all posts';
 
@@ -701,6 +789,7 @@ CREATE TABLE IF NOT EXISTS `item-content` (
        `verb` varchar(100) NOT NULL DEFAULT '' COMMENT 'ActivityStreams verb',
         PRIMARY KEY(`id`),
         UNIQUE INDEX `uri-plink-hash` (`uri-plink-hash`),
+        FULLTEXT INDEX `title-content-warning-body` (`title`,`content-warning`,`body`),
         INDEX `uri` (`uri`(191)),
         INDEX `plink` (`plink`(191)),
         INDEX `uri-id` (`uri-id`),
@@ -746,7 +835,8 @@ CREATE TABLE IF NOT EXISTS `mail` (
         INDEX `convid` (`convid`),
         INDEX `uri` (`uri`(64)),
         INDEX `parent-uri` (`parent-uri`(64)),
-        INDEX `contactid` (`contact-id`(32))
+        INDEX `contactid` (`contact-id`(32)),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='private messages';
 
 --
@@ -766,7 +856,9 @@ CREATE TABLE IF NOT EXISTS `mailacct` (
        `movetofolder` varchar(255) NOT NULL DEFAULT '' COMMENT '',
        `pubmail` boolean NOT NULL DEFAULT '0' COMMENT '',
        `last_check` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
-        PRIMARY KEY(`id`)
+        PRIMARY KEY(`id`),
+        INDEX `uid` (`uid`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Mail account data for fetching mails';
 
 --
@@ -777,7 +869,10 @@ CREATE TABLE IF NOT EXISTS `manage` (
        `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
        `mid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
         PRIMARY KEY(`id`),
-        UNIQUE INDEX `uid_mid` (`uid`,`mid`)
+        UNIQUE INDEX `uid_mid` (`uid`,`mid`),
+        INDEX `mid` (`mid`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+       FOREIGN KEY (`mid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='table of accounts that can manage each other';
 
 --
@@ -805,7 +900,8 @@ CREATE TABLE IF NOT EXISTS `notify` (
         PRIMARY KEY(`id`),
         INDEX `seen_uid_date` (`seen`,`uid`,`date`),
         INDEX `uid_date` (`uid`,`date`),
-        INDEX `uid_type_link` (`uid`,`type`,`link`(190))
+        INDEX `uid_type_link` (`uid`,`type`,`link`(190)),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='notifications';
 
 --
@@ -819,7 +915,11 @@ CREATE TABLE IF NOT EXISTS `notify-threads` (
        `parent-item` int unsigned NOT NULL DEFAULT 0 COMMENT '',
        `receiver-uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
         PRIMARY KEY(`id`),
-        INDEX `master-parent-uri-id` (`master-parent-uri-id`)
+        INDEX `master-parent-uri-id` (`master-parent-uri-id`),
+        INDEX `receiver-uid` (`receiver-uid`),
+        INDEX `notify-id` (`notify-id`),
+       FOREIGN KEY (`notify-id`) REFERENCES `notify` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+       FOREIGN KEY (`receiver-uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='';
 
 --
@@ -839,12 +939,13 @@ CREATE TABLE IF NOT EXISTS `oembed` (
 --
 CREATE TABLE IF NOT EXISTS `openwebauth-token` (
        `id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
-       `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
+       `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id - currently unused',
        `type` varchar(32) NOT NULL DEFAULT '' COMMENT 'Verify type',
        `token` varchar(255) NOT NULL DEFAULT '' COMMENT 'A generated token',
        `meta` varchar(255) NOT NULL DEFAULT '' COMMENT '',
        `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'datetime of creation',
-        PRIMARY KEY(`id`)
+        PRIMARY KEY(`id`),
+        INDEX `uid` (`uid`)
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Store OpenWebAuth token to verify contacts';
 
 --
@@ -870,7 +971,10 @@ CREATE TABLE IF NOT EXISTS `participation` (
        `fid` int unsigned NOT NULL COMMENT '',
         PRIMARY KEY(`iid`,`server`),
         INDEX `cid` (`cid`),
-        INDEX `fid` (`fid`)
+        INDEX `fid` (`fid`),
+       FOREIGN KEY (`iid`) REFERENCES `item` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+       FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+       FOREIGN KEY (`fid`) REFERENCES `fcontact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Storage for participation messages from Diaspora';
 
 --
@@ -883,7 +987,8 @@ CREATE TABLE IF NOT EXISTS `pconfig` (
        `k` varbinary(100) NOT NULL DEFAULT '' COMMENT '',
        `v` mediumtext COMMENT '',
         PRIMARY KEY(`id`),
-        UNIQUE INDEX `uid_cat_k` (`uid`,`cat`,`k`)
+        UNIQUE INDEX `uid_cat_k` (`uid`,`cat`,`k`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='personal (per user) configuration storage';
 
 --
@@ -922,40 +1027,10 @@ CREATE TABLE IF NOT EXISTS `photo` (
         INDEX `uid_profile` (`uid`,`profile`),
         INDEX `uid_album_scale_created` (`uid`,`album`(32),`scale`,`created`),
         INDEX `uid_album_resource-id_created` (`uid`,`album`(32),`resource-id`,`created`),
-        INDEX `resource-id` (`resource-id`)
+        INDEX `resource-id` (`resource-id`),
+       FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='photo storage';
 
---
--- TABLE poll
---
-CREATE TABLE IF NOT EXISTS `poll` (
-       `id` int unsigned NOT NULL auto_increment COMMENT '',
-       `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
-       `q0` text COMMENT '',
-       `q1` text COMMENT '',
-       `q2` text COMMENT '',
-       `q3` text COMMENT '',
-       `q4` text COMMENT '',
-       `q5` text COMMENT '',
-       `q6` text COMMENT '',
-       `q7` text COMMENT '',
-       `q8` text COMMENT '',
-       `q9` text COMMENT '',
-        PRIMARY KEY(`id`),
-        INDEX `uid` (`uid`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Currently unused table for storing poll results';
-
---
--- TABLE poll_result
---
-CREATE TABLE IF NOT EXISTS `poll_result` (
-       `id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
-       `poll_id` int unsigned NOT NULL DEFAULT 0,
-       `choice` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
-        PRIMARY KEY(`id`),
-        INDEX `poll_id` (`poll_id`)
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='data for polls - currently unused';
-
 --
 -- TABLE post-category
 --
@@ -1064,7 +1139,8 @@ CREATE TABLE IF NOT EXISTS `profile` (
        `net-publish` boolean NOT NULL DEFAULT '0' COMMENT 'publish profile in global directory',
         PRIMARY KEY(`id`),
         INDEX `uid_is-default` (`uid`,`is-default`),
-        FULLTEXT INDEX `pub_keywords` (`pub_keywords`)
+        FULLTEXT INDEX `pub_keywords` (`pub_keywords`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='user profiles data';
 
 --
@@ -1077,7 +1153,11 @@ CREATE TABLE IF NOT EXISTS `profile_check` (
        `dfrn_id` varchar(255) NOT NULL DEFAULT '' COMMENT '',
        `sec` varchar(255) NOT NULL DEFAULT '' COMMENT '',
        `expire` int unsigned NOT NULL DEFAULT 0 COMMENT '',
-        PRIMARY KEY(`id`)
+        PRIMARY KEY(`id`),
+        INDEX `uid` (`uid`),
+        INDEX `cid` (`cid`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
+       FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='DFRN remote auth use';
 
 --
@@ -1096,6 +1176,7 @@ CREATE TABLE IF NOT EXISTS `profile_field` (
         INDEX `uid` (`uid`),
         INDEX `order` (`order`),
         INDEX `psid` (`psid`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
        FOREIGN KEY (`psid`) REFERENCES `permissionset` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Custom profile fields';
 
@@ -1114,7 +1195,9 @@ CREATE TABLE IF NOT EXISTS `push_subscriber` (
        `renewed` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of last subscription renewal',
        `secret` varchar(255) NOT NULL DEFAULT '' COMMENT '',
         PRIMARY KEY(`id`),
-        INDEX `next_try` (`next_try`)
+        INDEX `next_try` (`next_try`),
+        INDEX `uid` (`uid`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Used for OStatus: Contains feed subscribers';
 
 --
@@ -1128,7 +1211,9 @@ CREATE TABLE IF NOT EXISTS `register` (
        `password` varchar(255) NOT NULL DEFAULT '' COMMENT '',
        `language` varchar(16) NOT NULL DEFAULT '' COMMENT '',
        `note` text COMMENT '',
-        PRIMARY KEY(`id`)
+        PRIMARY KEY(`id`),
+        INDEX `uid` (`uid`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='registrations requiring admin approval';
 
 --
@@ -1139,7 +1224,8 @@ CREATE TABLE IF NOT EXISTS `search` (
        `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
        `term` varchar(255) NOT NULL DEFAULT '' COMMENT '',
         PRIMARY KEY(`id`),
-        INDEX `uid` (`uid`)
+        INDEX `uid` (`uid`),
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='';
 
 --
@@ -1207,6 +1293,7 @@ CREATE TABLE IF NOT EXISTS `thread` (
         INDEX `uid_wall_received` (`uid`,`wall`,`received`),
         INDEX `private_wall_origin_commented` (`private`,`wall`,`origin`,`commented`),
         INDEX `uri-id` (`uri-id`),
+       FOREIGN KEY (`iid`) REFERENCES `item` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
        FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Thread related data';
 
@@ -1222,62 +1309,11 @@ CREATE TABLE IF NOT EXISTS `tokens` (
        `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id',
         PRIMARY KEY(`id`),
         INDEX `client_id` (`client_id`),
-       FOREIGN KEY (`client_id`) REFERENCES `clients` (`client_id`) ON UPDATE RESTRICT ON DELETE CASCADE
+        INDEX `uid` (`uid`),
+       FOREIGN KEY (`client_id`) REFERENCES `clients` (`client_id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='OAuth usage';
 
---
--- TABLE user
---
-CREATE TABLE IF NOT EXISTS `user` (
-       `uid` mediumint unsigned NOT NULL auto_increment COMMENT 'sequential ID',
-       `parent-uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'The parent user that has full control about this user',
-       `guid` varchar(64) NOT NULL DEFAULT '' COMMENT 'A unique identifier for this user',
-       `username` varchar(255) NOT NULL DEFAULT '' COMMENT 'Name that this user is known by',
-       `password` varchar(255) NOT NULL DEFAULT '' COMMENT 'encrypted password',
-       `legacy_password` boolean NOT NULL DEFAULT '0' COMMENT 'Is the password hash double-hashed?',
-       `nickname` varchar(255) NOT NULL DEFAULT '' COMMENT 'nick- and user name',
-       `email` varchar(255) NOT NULL DEFAULT '' COMMENT 'the users email address',
-       `openid` varchar(255) NOT NULL DEFAULT '' COMMENT '',
-       `timezone` varchar(128) NOT NULL DEFAULT '' COMMENT 'PHP-legal timezone',
-       `language` varchar(32) NOT NULL DEFAULT 'en' COMMENT 'default language',
-       `register_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp of registration',
-       `login_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp of last login',
-       `default-location` varchar(255) NOT NULL DEFAULT '' COMMENT 'Default for item.location',
-       `allow_location` boolean NOT NULL DEFAULT '0' COMMENT '1 allows to display the location',
-       `theme` varchar(255) NOT NULL DEFAULT '' COMMENT 'user theme preference',
-       `pubkey` text COMMENT 'RSA public key 4096 bit',
-       `prvkey` text COMMENT 'RSA private key 4096 bit',
-       `spubkey` text COMMENT '',
-       `sprvkey` text COMMENT '',
-       `verified` boolean NOT NULL DEFAULT '0' COMMENT 'user is verified through email',
-       `blocked` boolean NOT NULL DEFAULT '0' COMMENT '1 for user is blocked',
-       `blockwall` boolean NOT NULL DEFAULT '0' COMMENT 'Prohibit contacts to post to the profile page of the user',
-       `hidewall` boolean NOT NULL DEFAULT '0' COMMENT 'Hide profile details from unkown viewers',
-       `blocktags` boolean NOT NULL DEFAULT '0' COMMENT 'Prohibit contacts to tag the post of this user',
-       `unkmail` boolean NOT NULL DEFAULT '0' COMMENT 'Permit unknown people to send private mails to this user',
-       `cntunkmail` int unsigned NOT NULL DEFAULT 10 COMMENT '',
-       `notify-flags` smallint unsigned NOT NULL DEFAULT 65535 COMMENT 'email notification options',
-       `page-flags` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'page/profile type',
-       `account-type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
-       `prvnets` boolean NOT NULL DEFAULT '0' COMMENT '',
-       `pwdreset` varchar(255) COMMENT 'Password reset request token',
-       `pwdreset_time` datetime COMMENT 'Timestamp of the last password reset request',
-       `maxreq` int unsigned NOT NULL DEFAULT 10 COMMENT '',
-       `expire` int unsigned NOT NULL DEFAULT 0 COMMENT '',
-       `account_removed` boolean NOT NULL DEFAULT '0' COMMENT 'if 1 the account is removed',
-       `account_expired` boolean NOT NULL DEFAULT '0' COMMENT '',
-       `account_expires_on` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp when account expires and will be deleted',
-       `expire_notification_sent` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'timestamp of last warning of account expiration',
-       `def_gid` int unsigned NOT NULL DEFAULT 0 COMMENT '',
-       `allow_cid` mediumtext COMMENT 'default permission for this user',
-       `allow_gid` mediumtext COMMENT 'default permission for this user',
-       `deny_cid` mediumtext COMMENT 'default permission for this user',
-       `deny_gid` mediumtext COMMENT 'default permission for this user',
-       `openidserver` text COMMENT '',
-        PRIMARY KEY(`uid`),
-        INDEX `nickname` (`nickname`(32))
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='The local users';
-
 --
 -- TABLE userd
 --
@@ -1297,7 +1333,10 @@ CREATE TABLE IF NOT EXISTS `user-contact` (
        `blocked` boolean COMMENT 'Contact is completely blocked for this user',
        `ignored` boolean COMMENT 'Posts from this contact are ignored',
        `collapsed` boolean COMMENT 'Posts from this contact are collapsed',
-        PRIMARY KEY(`uid`,`cid`)
+        PRIMARY KEY(`uid`,`cid`),
+        INDEX `cid` (`cid`),
+       FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='User specific public contact data';
 
 --
@@ -1312,7 +1351,9 @@ CREATE TABLE IF NOT EXISTS `user-item` (
        `notification-type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
         PRIMARY KEY(`uid`,`iid`),
         INDEX `uid_pinned` (`uid`,`pinned`),
-        INDEX `iid_uid` (`iid`,`uid`)
+        INDEX `iid_uid` (`iid`,`uid`),
+       FOREIGN KEY (`iid`) REFERENCES `item` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
+       FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='User specific item data';
 
 --
@@ -1408,14 +1449,17 @@ CREATE VIEW `network-item-view` AS SELECT
        `item`.`network` AS `network`,
        `item`.`unseen` AS `unseen`,
        `item`.`gravity` AS `gravity`,
-       `item`.`contact-id` AS `contact-id`
+       `item`.`contact-id` AS `contact-id`,
+       `ownercontact`.`contact-type` AS `contact-type`
        FROM `item`
                        INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent`
-                       STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` AND (NOT `contact`.`blocked` OR `contact`.`pending`)
+                       STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id`
                        LEFT JOIN `user-item` ON `user-item`.`iid` = `item`.`id` AND `user-item`.`uid` = `thread`.`uid`
                        LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `thread`.`uid` AND `author`.`cid` = `thread`.`author-id`
                        LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `thread`.`uid` AND `owner`.`cid` = `thread`.`owner-id`
+                       LEFT JOIN `contact` AS `ownercontact` ON `ownercontact`.`id` = `thread`.`owner-id`
                        WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
+                       AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
                        AND (`user-item`.`hidden` IS NULL OR NOT `user-item`.`hidden`)
                        AND (`author`.`blocked` IS NULL OR NOT `author`.`blocked`)
                        AND (`owner`.`blocked` IS NULL OR NOT `owner`.`blocked`);
@@ -1436,14 +1480,17 @@ CREATE VIEW `network-thread-view` AS SELECT
        `thread`.`starred` AS `starred`,
        `thread`.`mention` AS `mention`,
        `thread`.`network` AS `network`,
-       `thread`.`contact-id` AS `contact-id`
+       `thread`.`contact-id` AS `contact-id`,
+       `ownercontact`.`contact-type` AS `contact-type`
        FROM `thread`
-                       STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` AND (NOT `contact`.`blocked` OR `contact`.`pending`)
+                       STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id`
                        STRAIGHT_JOIN `item` ON `item`.`id` = `thread`.`iid`
                        LEFT JOIN `user-item` ON `user-item`.`iid` = `item`.`id` AND `user-item`.`uid` = `thread`.`uid`
                        LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `thread`.`uid` AND `author`.`cid` = `thread`.`author-id`
                        LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `thread`.`uid` AND `owner`.`cid` = `thread`.`owner-id`
+                       LEFT JOIN `contact` AS `ownercontact` ON `ownercontact`.`id` = `thread`.`owner-id`
                        WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
+                       AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
                        AND (`user-item`.`hidden` IS NULL OR NOT `user-item`.`hidden`)
                        AND (`author`.`blocked` IS NULL OR NOT `author`.`blocked`)
                        AND (`owner`.`blocked` IS NULL OR NOT `owner`.`blocked`);
@@ -1512,6 +1559,7 @@ CREATE VIEW `owner-view` AS SELECT
        `contact`.`forum` AS `forum`,
        `contact`.`prv` AS `prv`,
        `contact`.`contact-type` AS `contact-type`,
+       `contact`.`manually-approve` AS `manually-approve`,
        `contact`.`hidden` AS `hidden`,
        `contact`.`archive` AS `archive`,
        `contact`.`pending` AS `pending`,