Я создаю приложение Xamarin. Android и для базы данных использую sqlite- net. Я пытался создать таблицу с такой структурой
public class Templates
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public int Category { get; set; }
[TextBlob("imagesBlobbed")]
public List<int> Images { get; set; }
public string imagesBlobbed { get; set; }
}
, но я хочу, чтобы каждый раз, когда я добавлял шаблон, он проверял, существует ли он, проверяя изображения следующим образом:
public static void AddTemplate(SQLiteConnection db, int category, List<int> images)
{
var alreadyExist = db.Table<Templates>().Where(record => record.Images == images);
if (alreadyExist?.Count() == 0)
{
var template = new Templates()
{
Category = category,
Images = images,
};
db.InsertWithChildren(template, recursive: true);
}
}
но это не работает, и я предполагаю, что это не работает, потому что вы не можете запросить с параметром «Изображения», в базе данных хранится как большой двоичный объект. Поэтому я предполагаю, что мне нужно преобразовать List во что-то еще, что более легко поддерживается в sqlite.
Я думаю об использовании расширений sqlite- net, которые поддерживают отношения один-ко-многим, и делают что-то вроде этого:
[Table("Templates")]
public class Template
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public int Category { get; set; }
[OneToMany]
public TemplateImage Images { get; set; } = new List<int>();
}
[Table("TemplateImages")]
public class TemplateImage
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public int Image1 { get; set; }
public int Image2 { get; set; }
public int Image3 { get; set; }
public int Image4 { get; set; }
public int Image5 { get; set; }
[ForeignKey(typeof(Template))]
public int TemplateId { get; set; }
}
В моем приложении каждый шаблон имеет 5 изображений, но это может измениться в будущем. Каков правильный подход в соответствии с дизайном БД: иметь объект TemplateImage с 5 изображениями или иметь только одно изображение для каждого объекта TemplateImage, например:
[Table("Templates")]
public class Template
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public int Category { get; set; }
[OneToMany]
public List<TemplateImage> Images { get; set; } = new List<int>();
}
[Table("TemplateImages")]
public class TemplateImage
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public int Image { get; set; }
[ForeignKey(typeof(Template))]
public int TemplateId { get; set; }
}
Является ли второй подход более медленным? Есть ли другой лучший способ для этого?