CREATE TABLE IF NOT EXISTS `user_family` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `owner_user_id` BIGINT NOT NULL COMMENT 'Owner User ID', `max_members` INT NOT NULL DEFAULT 5 COMMENT 'Max members in family', `status` TINYINT NOT NULL DEFAULT 1 COMMENT 'Status: 1=active, 0=disabled', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), `deleted_at` DATETIME(3) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uniq_owner_user_id` (`owner_user_id`), KEY `idx_status` (`status`), KEY `idx_deleted_at` (`deleted_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `user_family_member` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `family_id` BIGINT NOT NULL COMMENT 'Family ID', `user_id` BIGINT NOT NULL COMMENT 'Member User ID', `role` TINYINT NOT NULL DEFAULT 2 COMMENT 'Role: 1=owner, 2=member', `status` TINYINT NOT NULL DEFAULT 1 COMMENT 'Status: 1=active, 2=left, 3=removed', `join_source` VARCHAR(32) NOT NULL DEFAULT '' COMMENT 'Join source', `joined_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `left_at` DATETIME(3) DEFAULT NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), `deleted_at` DATETIME(3) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uniq_user_id` (`user_id`), KEY `idx_family_status` (`family_id`, `status`), KEY `idx_deleted_at` (`deleted_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;