如何优化SQL查询和数据检索过程,以便从三个表中显示用户的关注者:“users”(包含用户元数据)、“followers”(包含所有followers的UUID数组)和“following”(包含所有followers的UUID数组)?目前,我正在检索所有UUID,然后从“users”表中获取每个UUID的配置文件元数据。我尝试在SupplyKey中创建一个外键数组,但遇到了问题。当前代码运行良好,但是否有更有效的查询或分页方法来获取和显示关注者数据?我是SQL新手,从Firebase迁移过来的。谢谢你的帮助。
查询代码:
/// Stores all the UUID from the circle
List totalFollowers = [];
/// Fn to fetch all the users in the circle
Future<void> fetchFollowersDB() async {
try {
final data = await supabase
.from('followers')
.select('followers_list')
.eq(
'user_id',
_currentUuid,
)
.single();
// Update profileModel with the retrieved data
if (data != null) {
totalFollowers = data['followers_list'];
} else {
if (kDebugMode) {
print('Error fetching profile data: ${data.error?.message}');
}
}
} catch (e) {
if (kDebugMode) {
print(e);
}
}
update();
}
/// Stores all the Profile data for the circle
List<ProfileModel> followersProfiles = [];
/// Get Profile data as per UUID
Future<void> fetchFollowersProfiles() async {
followersProfiles.clear();
//
for (var uuid in totalFollowers) {
try {
final data = await supabase
.from('users')
.select('*')
.eq(
'uuid',
uuid,
)
.single();
// Add profileModel to circleProfiles
if (data != null) {
followersProfiles.add(ProfileModel.fromMap(data));
} else {
if (kDebugMode) {
print('Error fetching profile data: ${data.error?.message}');
}
}
} catch (e) {
if (kDebugMode) {
print(e);
}
}
}
update();
}
小部件
class FollowersAndFollowingTab extends StatelessWidget {
List usersList;
FollowersAndFollowingTab({super.key, required this.usersList});
@override
Widget build(BuildContext context) {
return GetBuilder<DBController>(
builder: (_) => ListView.builder(
shrinkWrap: true,
itemCount: usersList.length,
itemBuilder: (context, index) {
ProfileModel userProfile = usersList[index];
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: Card(
child: ListTile(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
fullscreenDialog: true,
builder: (context) => ProfileViewScreen(
profileModel: userProfile,
),
),
);
},
leading: Container(
width: 50,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
image: DecorationImage(
fit: BoxFit.cover,
image:
CachedNetworkImageProvider(userProfile.profilePhoto!),
),
),
),
title: Text(
'${_bioWidgets.fullNameNoFlag(
profileModel: userProfile,
)} ${_bioWidgets.returnFlagEmoji(
profileModel: userProfile,
)}',
),
subtitle: Text('@${userProfile.username!}'),
trailing: IconButton(
onPressed: () {},
icon: const Icon(
Icons.more_vert,
color: Colors.grey,
),
),
),
),
);
},
),
);
}
}
1条答案
按热度按时间unhi4e5o1#
好吧,imo将这些值存储为数组违背了关系数据的目的!但我能理解考虑到你是从消防基地来的
数据建模
您当前的方法
更好的方法
获取数据
方法1 -使用FK进行调试
如果你能让SQL来做,为什么还要用你的代码呢?;)
进入Supplement-> Table Editor -> your table -> API并检查这部分:
在查询时也可以获取FK表。尽管考虑到有多个FK指向同一个表,您需要进行一些尝试和错误来使其工作。不管怎样,看起来像这样:
如果你想把它作为一个数组,有一个SQL函数
array
来做。如果没有,请在应用程序代码中处理它。这是我推荐的方法。
方法二-视图
如果您发现自己在将来总是要查询一堆表,那么您可以创建一个“视图”--基本上就是您需要的来自多个表的一组数据。然后可以像查询表一样通过API调用查询视图。
这是一个例子,只是让你知道什么是可能的。
创建视图的示例代码:
之后,如果你像普通表一样调用
followers_with_names
,你会得到uuid
,name
和一个follower名称数组。像无论如何,我很乐意聊天,如果你有更多的疑问。如果你想的话,请在你的个人资料页面上留下你的电子邮件,我会联系你的:)