我很好奇我应该如何在我的应用程序中组织图像存储。它们将存储在某个地方的磁盘上,路径/ url存储在数据库中,但我的应用程序变得复杂,图像组织让我感到困惑。我使用的技术是ASP.NET MVC 3 + EF 4.1 Code First(在复杂的关系中证明是困难的。)
这是一个基于系列的应用程序,因此有一个Family表,Member表和一个FamilyMember表可以链接到两个。还有一个FamilyEvent和MemberEvent表来跟踪家庭或成员生活中的事件。
使用案例
会员可以上传多张个人资料图片(可能会放入“个人资料”专辑吗?)
会员可以上传“家庭”照片,附加到“家庭”对象,并为家庭添加某种类型的相册。
会员可以添加会员活动,并将多个图片附加到会员活动。
会员可以添加家庭活动,并将多个图片附加到家庭活动中。
这些是基本用例。
我的想法
基础“图片”表格,其中包含ID,说明以及上传者的用户ID。
具有id,pictureId,memberId等的MemberProfilePicture表...
具有id,pictureId,[member id?],membereventid等的MemberEventPicture表...
带有id,pictureId,[familyId?],familyeventid等的FamilyEventPicture表...
这将允许家庭或成员在稍后将图片“链接”到另一个个人资料照片/会员活动/家庭活动。
我的问题
这是正确的,还是我过于复杂?我没有看到除了多个表之外的任何其他方式来表示不同事物的图像,这些都是指基本图片表。任何人都可以就如何改进这个模型提出任何建议吗?虽然我知道可能有许多定义需要纠正,但我正在寻找解决方案,如何组织我的应用程序的成像方面,或者改进我已经有的。
答案 0 :(得分:2)
您使用的是EF Code First,所以让我们谈谈代码而不是表格。您可以通过只有一个Picture类并将许多图片与Member,Family等关联来实现您的用例。
使用此代码
public class Family
{
public int Id { get; set; }
public virtual ICollection<Picture> Pictures { get; set; }
public virtual ICollection<Member> Members { get; set; }
}
public class Member
{
public int Id { get; set; }
public virtual ICollection<Picture> Pictures { get; set; }
}
public class Picture
{
public int Id { get; set; }
public String Location { get; set; }
}
将生成3个表,家庭,成员,带有两个外键Family_Id和Member_Id的Pictures表的图片。此模型允许将单个图片与成员,家庭或两者相关联。
从可伸缩性的角度来看,我会避免将图像二进制文件存储在数据库中并使用ORM来访问二进制文件。更好的想法是将图片存储在文件系统或像MongoDBs GridFS这样的“专用”服务器中。
答案 1 :(得分:1)
我要做的是有三张桌子。
“图片”表,用于存储每张图片和位置的唯一ID。 “个人资料”表格中有关于个人资料的详细信息。 由pictureId和profileId
组成的第三个“链接”表如果我想将图片A链接到配置文件X,我只需将“A,X”添加到链接表中即可。事件或其他什么相同。如果要有多对多关系,这是最干净的方法(我假设同一张图片可以在多个配置文件中)。
希望我能正确理解你的问题。