1

主キーは一意でなければならないことはわかっています。しかし、郵便番号が住所テーブルの主キーである不動産会社のデータベースを作成しています。しかし、不動産が販売/賃貸用であり、アパートのブロックにある場合、多くの不動産は同じ郵便番号を持ちます. PostCode を PK として保持しながら、Not Uniqe にするにはどうすればよいですか? ありがとう

これまでの私のコード:

CREATE TABLE `Properties` (
  `PropertyID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `Property Type` varchar(20) NOT NULL,
  `PostCode` varchar(8) NOT NULL,
  `Bedrooms` tinyint(2) DEFAULT NULL,
  `Bathrooms` tinyint(2) DEFAULT NULL,
  `Ensuite` tinyint(1) DEFAULT NULL,
  `Kitchen` tinytext,
  `LivingRoom` tinytext,
  `DiningRoom` tinytext,
  `UtilityRoom` tinytext,
  `Conservatory` tinytext,
  `Garage` tinytext,
  `Garden` tinytext,
  `Furnished` tinytext,
  `Type` char(15) NOT NULL,
  PRIMARY KEY (`PropertyID`),
  KEY `Property Type` (`Property Type`),
  KEY `PostCode` (`PostCode`),
  CONSTRAINT `Properties_ibfk_2` FOREIGN KEY (`PostCode`) REFERENCES `Address` (`PostCode`),
  CONSTRAINT `Properties_ibfk_1` FOREIGN KEY (`Property Type`) REFERENCES `PropertyType` (`Property Type`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1





 CREATE TABLE `Address` (
      `PostCode` varchar(8) NOT NULL,
      `HouseN` text NOT NULL,
      `AddL1` varchar(25) NOT NULL,
      `AddL2` varchar(25) DEFAULT NULL,
      `AddL3` varchar(25) DEFAULT NULL,
      `County` char(20) NOT NULL,
      PRIMARY KEY (`PostCode`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
4

3 に答える 3

9

主キーは定義によって一意です。より良い方法は、代理キー (自動採番値など) を使用するか、郵便番号やプロパティ名/番号などの複数の列をカバーする複合キーを使用することです。

もちろん、一部の国 (英国など) では、特定のプロパティの郵便番号が時間の経過とともに変更される可能性があることに注意してください。このため、私は代理キーアプローチを提唱します。

于 2013-11-05T12:15:44.077 に答える
7

データベースの設計には、2 つの異なる側面/クラス/スタイルがあります。

  1. 最初のスタイルは、主キーが自動インクリメント整数や GUID のような仮想的なものであるべきだと言っています。現実世界に存在するものではなく、現実世界のすべてが変化する可能性があるからです。
  2. 2 番目のスタイルは、テーブルに存在するデータのみを含める必要があることを示しており、主キーは、クライアントがテーブルを一意に識別すると言うもので構成されます。

ご覧のとおり、これらは 2 つの完全に反対側です。個人的には前者をお勧めしますが、もちろん自由に選べます。データベース内の単一のスタイルに固執しようとするのは賢明なことです。

あなたが言及した問題では、主キーは(顧客によって)郵便番号として定義されていました。ここで、郵便番号が各行を一意に識別しないという問題に踏み込みます。 結論: 主キーが正しく定義されていません。

解決策: ローランドが言ったこと: 代理キー (1 番目のクラス) を使用するか、実際には既に所有しています: PropertyID. 2 番目のオプション: キーにフィールドを追加して、家/番地などの各行を一意に識別できるようにします。

于 2013-11-05T13:13:31.960 に答える