我正在开发一款需要一些基本数据关联的应用。我已选择SQLite
作为我的数据库选择,以简化并在将来在我的应用程序的移动版本中使用它。它有一些限制因此我可能完全错误。
一个简单的方案如下:
我需要为汽车分配类别,以便汽车可以属于多个类别。类别是预定义的。
我的方法:
'Cars'
,'Categories'
,'CategoriesAssigned'
'Car'
都可以属于多个'Category'
。'CategoriesAssigned'
用于将'Categories'
映射到'Cars'
在SQLite
结束时,我创建了三个表:
CREATE TABLE Cars(
Id INT PRIMARY KEY NOT NULL,
Name TEXT NOT NULL,
);
CREATE TABLE Categories(
Id INT PRIMARY KEY NOT NULL,
Name TEXT NOT NULL,
);
CREATE TABLE CategoriesAssigned(
Id INT PRIMARY KEY NOT NULL,
CategoryId INTEGER NOT NULL,
CarId INTEGER NOT NULL,
FOREIGN CategoryId(Id) REFERENCES Categories(Id),
FOREIGN CarId(Id) REFERENCES Cars(Id),
);
因此,每个'Category'
我可以有多个'Car'
。我不喜欢的是会有很多重复数据,例如'Category'
会重复许多汽车。
我对数据库仍然很陌生,希望得到一些关于如何正确处理这类场景的建议和反馈。
更新
另一种方式,我个人讨厌:
CREATE TABLE Cars(
Id INT PRIMARY KEY NOT NULL,
Categories TEXT,
Name TEXT NOT NULL,
);
CREATE TABLE Categories(
Id INT PRIMARY KEY NOT NULL,
Name TEXT NOT NULL,
);
然后将'Categories'
添加为昏迷分离:即“Trucks,Luxury,Diesel”,最后解析字符串。但这种感觉更加错误。
答案 0 :(得分:1)
看起来你在这里有多对多的关系,所以中间表是干净的关系数据库设计的正确方法。你说你会有重复数据,但我认为你的意思是你会有一个看起来非常重复的表,而实际上每一行都是唯一的。
如果你有车:
1. Buick Whatever
2. Ford BigRig
3. Chevy Sprite
4. Toyota Thimble
5. Nissan Panther
分类
1. Fast
2. Economical
3. Used
然后CategoriesAssigned可能是:
1. 1 (Buick), 2 (Economical)
2. 3 (Chevy), 2 (Economical)
3. 4 (Toyota), 2 (Economical)
4. 2 (Ford), 3 (Used)
5. 4 (Toyota), 3 (Used)
6. 2 (Ford), 1 (Fast)
7. 3 (Chevy), 1 (Fast)
因此,这继续,两列中都有很多重复,但没有两行是相同的。
人们可以在没有中间表的情况下处理这个问题的另一种方法是向Cars添加一个名为Categories的字段,然后是某种分隔列表;我经常看到用于此的管道字符。例如,Ford BigRig的字段可能是
Used|Fast
优点是SQL更少。缺点是您必须手动过滤数据而不是直接查询。