0

我正在尝试插入一项涉及许多朋友的费用。但是使用外键,它只能引用一个friendId,但我想在费用表中存储2个friendId而不是一个为expenseFriend。因为每个朋友可以有很多费用,而一笔费用可以被很多朋友分担。我该如何实现这种关系?也许不使用外键?谁能给我这样做的想法?非常感谢。

这是我的创建数据库代码:

public void onCreate(SQLiteDatabase database) {
    String query, query1, query2, query3;
    query = "CREATE TABLE events ( eventId INTEGER PRIMARY KEY, eventName TEXT, eventDate TEXT, eventLocation TEXT, eventDescription TEXT);";
    query1 = "CREATE TABLE friends ( friendId INTEGER PRIMARY KEY, friendName TEXT, friendNumber TEXT, friendEmail TEXT, friendSpending DOUBLE, friendEvent INTEGER, FOREIGN KEY(friendEvent) REFERENCES events(eventId) ON DELETE CASCADE);";
    query2 = "CREATE TABLE expenses ( expenseId INTEGER PRIMARY KEY, expenseName TEXT, expenseType TEXT, expensePrice REAL, expenseQuantity INTEGER, expenseEvent INTEGER REFERENCES events(eventId) ON DELETE CASCADE, expenseFriend INTEGER REFERENCES friends(friendId) ON DELETE CASCADE);";
    query3 = "CREATE TABLE temporary (_id INTEGER PRIMARY KEY, spendingId INTEGER)";
    database.execSQL(query);
    database.execSQL(query1);
    database.execSQL(query2);
    database.execSQL(query3);
    Log.d(LOGCAT, "events Created");
    Log.d(LOGCAT, "friends Created");
    Log.d(LOGCAT, "expenses Created");
4

1 回答 1

1

你说:

每个朋友可以有很多费用,一个费用可以被很多朋友分担

这意味着朋友和费用之间存在多对多的关系。经验法则指出,所有多对多关系都会生成一个新表。话虽如此,您应该创建以下表格(以粗体显示主键):

  • 朋友:friendId,friendName...
  • 费用:费用Id,费用名称...
  • FRIENDS_EXPENSES:friendIdexpenseId

请注意,在新表中有 2 个粗体字段。这并不意味着有 2 个主键,而是有一个复合主键。也就是说,可以有重复的friendId和重复的expenseId,但是这对(friendId,expenseId)是唯一的。

这样,您就可以将多对多关系转变为 2 个一对多关系,您似乎知道如何使用它们。

于 2013-11-09T15:08:30.643 回答