面试题答案
一键面试数据库架构设计
-
用户动态表(posts)
id
:整数类型,主键,自增长,唯一标识每条动态。user_id
:整数类型,关联用户表,表明这条动态属于哪个用户。text
:文本类型,存储动态的文本内容,可以为空。image_path
:文本类型,存储图片的路径,如果有图片则记录路径,否则为空。video_path
:文本类型,存储视频的路径,如果有视频则记录路径,否则为空。created_at
:日期时间类型,记录动态创建的时间。
-
点赞表(likes)
id
:整数类型,主键,自增长。user_id
:整数类型,关联用户表,表明点赞的用户。post_id
:整数类型,关联posts
表,表明点赞的动态。created_at
:日期时间类型,记录点赞的时间。
-
评论表(comments)
id
:整数类型,主键,自增长。user_id
:整数类型,关联用户表,表明评论的用户。post_id
:整数类型,关联posts
表,表明评论的动态。comment_text
:文本类型,存储评论的内容。created_at
:日期时间类型,记录评论的时间。
数据持久化实现
在Flutter中使用sqflite
库来操作SQLite数据库。
- 创建数据库
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
Future<Database> initDatabase() async {
final databasePath = await getDatabasesPath();
final path = join(databasePath, 'social_app.db');
return openDatabase(
path,
version: 1,
onCreate: (Database db, int version) async {
await db.execute('''
CREATE TABLE posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
text TEXT,
image_path TEXT,
video_path TEXT,
created_at DATETIME
)
''');
await db.execute('''
CREATE TABLE likes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
post_id INTEGER,
created_at DATETIME,
FOREIGN KEY (post_id) REFERENCES posts(id)
)
''');
await db.execute('''
CREATE TABLE comments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
post_id INTEGER,
comment_text TEXT,
created_at DATETIME,
FOREIGN KEY (post_id) REFERENCES posts(id)
)
''');
},
);
}
- 插入数据
- 插入动态
Future<void> insertPost(Database db, int userId, String text, String imagePath, String videoPath) async {
await db.insert(
'posts',
{
'user_id': userId,
'text': text,
'image_path': imagePath,
'video_path': videoPath,
'created_at': DateTime.now().toString()
},
);
}
- **插入点赞**
Future<void> insertLike(Database db, int userId, int postId) async {
await db.insert(
'likes',
{
'user_id': userId,
'post_id': postId,
'created_at': DateTime.now().toString()
},
);
}
- **插入评论**
Future<void> insertComment(Database db, int userId, int postId, String commentText) async {
await db.insert(
'comments',
{
'user_id': userId,
'post_id': postId,
'comment_text': commentText,
'created_at': DateTime.now().toString()
},
);
}
数据更新实现
- 更新动态
Future<void> updatePost(Database db, int postId, String text, String imagePath, String videoPath) async {
await db.update(
'posts',
{
'text': text,
'image_path': imagePath,
'video_path': videoPath,
},
where: 'id =?',
whereArgs: [postId],
);
}
- 删除点赞
Future<void> deleteLike(Database db, int userId, int postId) async {
await db.delete(
'likes',
where: 'user_id =? AND post_id =?',
whereArgs: [userId, postId],
);
}
- 更新评论
Future<void> updateComment(Database db, int commentId, String commentText) async {
await db.update(
'comments',
{
'comment_text': commentText,
},
where: 'id =?',
whereArgs: [commentId],
);
}
复杂查询实现
- 查询某个用户点赞过的所有动态
Future<List<Map<String, dynamic>>> queryUserLikedPosts(Database db, int userId) async {
return await db.rawQuery('''
SELECT posts.*
FROM posts
JOIN likes ON posts.id = likes.post_id
WHERE likes.user_id =?
''', [userId]);
}
- 查询某个动态的所有评论
Future<List<Map<String, dynamic>>> queryCommentsByPostId(Database db, int postId) async {
return await db.query(
'comments',
where: 'post_id =?',
whereArgs: [postId],
);
}
- 查询某个用户发布的所有动态
Future<List<Map<String, dynamic>>> queryUserPosts(Database db, int userId) async {
return await db.query(
'posts',
where: 'user_id =?',
whereArgs: [userId],
);
}