2011-07-21 109 views
0

我有兩個SQL表,A和B.每個表都有主鍵ID。表B有字段X(可以是NULL),它指的是A的ID(如果它不是空的)。要使用哪個數據庫的ID?

然後,我需要存儲在表A的對象標識符的列表(存儲在一個文件)

你建議哪一個ID來使用,A.ID或B.ID列表中? (很顯然,如果在B中有一行的ID,我們可以推斷出A中一行的ID,只要B中的這一行具有非空X.)

[ADDED]要清楚:一個對象是部分存儲在A和部分B中

[ADDED]的表的結構(z_users是B,z_clients是A,z_users.client是字段X):

 
CREATE TABLE `z_users` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `password` varchar(255) collate utf8_bin NOT NULL, 
    `fullname` varchar(255) collate utf8_bin NOT NULL, 
    `phone` varchar(255) collate utf8_bin NOT NULL, 
    `address` text collate utf8_bin NOT NULL, 
    `email` varchar(255) collate utf8_bin default NULL, 
    `admin` enum('false','true') collate utf8_bin NOT NULL default 'false', 
    `worker` int(10) unsigned default NULL, 
    `client` int(10) unsigned default NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `worker` (`worker`), 
    UNIQUE KEY `client` (`client`), 
    UNIQUE KEY `email` (`email`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

CREATE TABLE `z_clients` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `company` text collate utf8_bin NOT NULL, 
    `shortdesc` text collate utf8_bin NOT NULL, 
    `site` varchar(255) collate utf8_bin NOT NULL, 
    `affair` varchar(255) collate utf8_bin NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 
+0

編輯我的答案。 – Jacob

回答

0

如果對象被存儲在表A中,使用表A的ID是唯一合乎邏輯的事情。

在回答您的編輯:

我看不到你的表之間的連接。但如果它是一對一的關係,它可能應該放在一張表中。 如果它是一對多的,則使用「一個」表的主鍵。

+0

它是1到0..1的關係 – porton

+0

那麼你別無選擇,只能使用「一個」表的關鍵,因爲其他可能不存在? – Jacob

+0

如果它不存在,他不能在ID列表(我存儲在一個文件中) – porton

0

您使用對您正在解決的業務案例有意義的集合。

  1. 你可以選擇所有的A無論是否有乙
  2. 你可以選擇的所有B無論是否有一個A
  3. 你可以選擇所有的A僅當有一個相應的B
  4. 你可以選擇所有的B只有在有一個對應的A
  5. 您可以用(其它屬性
+0

我補充說明:一個對象部分存儲在A中,部分存儲在B中。 – porton

+0

請張貼表格的結構。 – Jacob

+0

@cularis:根據您的要求,我將表格的結構添加到問題中 – porton

1

使用業務鍵的額外條件NATURA選擇任何這些l鍵)。將代理鍵持久存儲在數據庫之外通常是不明智的,因爲它會創建一個隱藏的依賴關係 - 如果代理鍵被重構或其值改變,那麼數據庫外部的數據將變爲無效或引用錯誤的值。

您的每張表似乎只有一個密鑰,並且我不清楚在這種情況下商業密鑰應該是什麼。