2011-09-05 91 views
1

之间的链接大量价值不措辞我的问题非常好,但这些表:设计数据库:表

USER TABLE      ANIMALS 
    u_id username     a_id animal 
    --------------------------  --------------------------- 
     2 alice      1 cat 
     4 brian      2 small dog 
     7 carla      3 big dog 
             4 rabbit 
             5 guinea pig 
             etc. 

我希望用户能够自己拥有但许多动物添加到他们的个人资料。

什么新的表格/字段和数据类型是我最好的办法呢?

谢谢。

回答

3

如果您需要为每个用户允许多种类型的相同动物(珍妮特可以有多个兔子),请执行以下操作。使UserId和AnimalID成为主键。

我只想做

UserAnimals 
------------ 
UserId 
AnimalID 

数据的桌上摆满可能是这样的:

UserAnimals 
------------ 
UserId || AnimalId 
     4 || 3 
     4 || 2 
     7 || 4 

布莱恩有一个小的狗和一只大狗。卡拉有一只兔子。

+0

谢谢你的回答。 – penpen

+0

谢谢你的回答。 我的例子中的一个缺陷是你只能拥有一种类型的动物。 我考虑过使用一个像你说的表(减去数量字段)但不会有大量冗余数据,特别是如果它是一个非常大的表? 有没有有效的方式做这样的表: 表名称 - UserAnimals。 FIELD - User_ID(例如值:“4”)。 FIELD - Animal_IDS(例如值:“1,2,5”)。 – penpen

+0

这正是我的答案是...没有数量列。我会用一个例子来修改我的答案。 –

0

我会推荐你​​多对多的关系表。

例子:id为

table: users_x_animals 
----------------------- 
pid | u_id | a_id 
1  2  3 
2  4  5 
3  2  5 
4  7  1 
5  4  2 

这样,如果你有U_ID指数(独立)和A_ID您可以任意查询“ID为X的动物是由用户拥有”或者周围的其他方式“用户x拥有这些动物“。

希望有所帮助。 :)

+1

如果用户只能有一种类型的动物(珍妮特可以有许多动物,但只有一只兔子),那么你可以删除主键列并将u_id和a_id列作为主键。 –

+0

是的,这是真的,因为主键是独特的,我以为一个用户可以添加一种动物,例如我可以有两只猫“朱莉”和“汤姆”,我想添加“猫”我的动物列出两次,一次是“朱莉”,一次是“汤姆”。 Up投票:) – ludesign

+0

OP没有指定他们是否需要支持多种类型的相同动物......我修改了我的答案,在Janet可以有2只兔子的场景中使用数量列。你的解决方案也适用于这种情况,但我认为一个数量列比为这个目的计数行要好。 –

1

本质上你需要一个表,将用户ID映射到动物ID。 如果你想将它们添加1的时间,你可以只使用一个表像这样:

UserAnimals 
----------- 
UserID (fk to User Table) 
AnimalId (fk to Animal Table) 

假设他们可能拥有,说3只狗,你要跟踪的号码,你既可以有每个动物或行,你可以修改表,包括各类型的动物的数量:

UserAnimals 
----------- 
UserID 
AnimalID 
Count 

我可能这样做的,如果我知道有一个很好的机会,人们将有数倍一个给定的动物,否则当检索到达总数时还有更多的工作要做。

我想人们可以提出这样的观点:ID字段对动物来说也不是绝对必要的。它可能只是一个字符串查找表,虽然这需要更多的空间用于存储,并且如果您决定由于某种原因决定修改动物名称,则会使事情稍微复杂一些。

+0

Upvoted是迄今为止唯一提及外键的人。但新表上的主键应该是(UserID,AnimalID),我相信OP也需要知道这一点。 –

+0

@Catcall,感谢您的支持。当然,表上的主键将取决于OP是否添加一个Count列 - 显然如果没有Count列并且需要有N个狗,例如我们不能创建PK(UserID,AnimalID ) - 因为在那个点上会有N行有相同的用户ID,所以AnimalID组合 - 可能会在那里抛出单向ID,我想。虽然我可能倾向于与自己的Count领域一起去。 – itsmatt