上一篇
🚀 ASP开发 | 数据库管理 | 手把手教你玩转单选项数据库
想象一下,你正在开发一个在线调查系统,用户需要选择性别、职业类型或对产品评分,这些互斥选项(单选)如果直接硬编码在前端,后期修改选项时就得改代码、发版本,简直是一场灾难!😱
痛点:
这时候,单选项数据库就像救星一样登场了!它能把选项存进数据库,前端通过API动态渲染,后端还能轻松分析数据,今天就带你从0到1搭建一个高效管理的单选项数据库!💪
根据微软官方推荐和2025年最新实践,推荐使用三表结构,灵活又扩展性强!
存储所有单选问题,您的性别?”、“您对服务的满意度?”。
CREATE TABLE Questions ( QuestionID INT PRIMARY KEY IDENTITY(1,1), QuestionText NVARCHAR(200) NOT NULL, IsActive BIT DEFAULT 1 -- 控制问题是否显示 );
每个问题的选项都存这里,男/女”、“非常满意/满意/一般”。
CREATE TABLE Options ( OptionID INT PRIMARY KEY IDENTITY(1,1), QuestionID INT FOREIGN KEY REFERENCES Questions(QuestionID), OptionText NVARCHAR(100) NOT NULL, DisplayOrder INT DEFAULT 0 -- 控制选项显示顺序 );
记录用户的选择,比如用户A选了“男”,用户B选了“非常满意”。
CREATE TABLE Responses ( ResponseID BIGINT PRIMARY KEY IDENTITY(1,1), UserID INT NOT NULL, -- 关联用户表 QuestionID INT FOREIGN KEY REFERENCES Questions(QuestionID), SelectedOptionID INT FOREIGN KEY REFERENCES Options(OptionID), ResponseTime DATETIME DEFAULT GETUTCDATE() );
通过AJAX从后端获取问题及选项,动态生成单选按钮:
<div id="questionContainer"></div> <script> fetch('/api/questions/1') // 假设获取问题ID=1的详情 .then(response => response.json()) .then(data => { let html = `<h3>${data.questionText}</h3>`; data.options.forEach(option => { html += `<label><input type="radio" name="option" value="${option.optionID}"> ${option.optionText}</labelbr>`; }); document.getElementById('questionContainer').innerHTML = html; }); </script>
使用Entity Framework Core(2025年最佳实践)简化数据访问:
[ApiController] [Route("api/[controller]")] public class QuestionsController : ControllerBase { private readonly AppDbContext _context; public QuestionsController(AppDbContext context) { _context = context; } // GET: api/questions/1 [HttpGet("{id}")] public async Task<IActionResult> GetQuestion(int id) { var question = await _context.Questions .Include(q => q.Options) .FirstOrDefaultAsync(q => q.QuestionID == id); if (question == null) return NotFound(); return Ok(new { questionText = question.QuestionText, options = question.Options.Select(o => new { o.OptionID, o.OptionText }) }); } // POST: api/responses [HttpPost] public async Task<IActionResult> SubmitResponse([FromBody] ResponseModel model) { var response = new Response { UserID = model.UserID, QuestionID = model.QuestionID, SelectedOptionID = model.SelectedOptionID, ResponseTime = DateTime.UtcNow }; _context.Responses.Add(response); await _context.SaveChangesAsync(); return Ok(new { success = true }); } }
IsActive
字段加索引,快速筛选启用的问题。 QuestionID
和DisplayOrder
建复合索引,排序更高效。 UserID
和ResponseTime
建索引,方便按用户或时间统计。 使用ASP.NET Core的内存缓存,缓存高频访问的问题选项:
public class QuestionsService { private readonly AppDbContext _context; private readonly IMemoryCache _cache; public QuestionsService(AppDbContext context, IMemoryCache cache) { _context = context; _cache = cache; } public async Task<Question> GetQuestionWithOptions(int id) { return await _cache.GetOrCreateAsync($"question_{id}", async entry => { entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10); return await _context.Questions .Include(q => q.Options) .FirstOrDefaultAsync(q => q.QuestionID == id); }); } }
SelectedOptionID
是否有效: public class ResponseValidator : AbstractValidator<ResponseModel> { public ResponseValidator(AppDbContext context) { RuleFor(x => x.SelectedOptionID).MustAsync(async (id, cancellation) => { return await context.Options.AnyAsync(o => o.OptionID == id); }).WithMessage("无效的选项!"); } }
假设要开发一个调查系统,步骤如下:
SELECT o.OptionText, COUNT(*) AS Count FROM Responses r JOIN Options o ON r.SelectedOptionID = o.OptionID WHERE r.QuestionID = 1 GROUP BY o.OptionText;
信息来源基于2025年8月最新技术资料整理,参考了微软官方文档、CSDN技术博客及Stack Overflow社区实践。
本文由 业务大全 于2025-08-22发表在【云服务器提供商】,文中图片由(业务大全)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://cloud.7tqx.com/wenda/691627.html
发表评论