1

私は複合主キーを持っていますが、これらを合わせるとかなり大きい(〜2000バイト)ことがわかります。パフォーマンスに関する考慮事項はありません。一意性を強制するための主キーが必要です。

MySqlは長い主キーが好きではありません。これを回避する方法はありますか?おそらく、インデックスを作成せずに、一意性を強制するだけですか?

主キーを有効にするためだけにUTF8の代わりにASCIIを使用したくありません(UTF8文字は3バイトかかります)。

私のテーブルは次のように定義されています。

CREATE TABLE `configuration` (
  `Section` varchar(200) NOT NULL,
  `StoredKey` VARCHAR(200) NOT NULL,
  `ServiceName` VARCHAR(300) NOT NULL,
  `ServiceMajorVersion` int unsigned NOT NULL,
  `ServiceMinorVersion` int unsigned NOT NULL,
  `ServiceInstanceID` VARCHAR(100) NOT NULL,
  `StoredValue` VARCHAR(1024)

 , PRIMARY KEY (`Section`, `StoredKey`, `ServiceName`, `ServiceMajorVersion`, `ServiceMinorVersion`, `ServiceID`)   
 )  ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
4

5 に答える 5

4

@porneLはこの場合の正しい答えを持っていますが、@Cade Roux@noonexも正しいです。データベースは Excel のように使用するためのものではありません。

セカンダリ テーブルが必要です。

CREATE TABLE ServiceInstance (
    ID int(11) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
    Hash binary(16) NOT NULL,
    ServiceInstanceID varchar(100) NOT NULL,
    UNIQUE(Hash)
);

構成行ごとに一意になるデータを除く各テーブル。

挿入するときは、次のようにします。

INSERT INTO ServiceInstance (Hash, ServiceInstanceID) VALUES (unhex(md5('whatever')), 'whatever');

次に、プライマリ テーブルは次のようになります。

CREATE TABLE `configuration` (
    `Section_ID`          int unsigned NOT NULL,
    `StoredKey_ID`        int unsigned NOT NULL,
    `ServiceName_ID`      int unsigned NOT NULL,
    `ServiceMajorVersion` int unsigned NOT NULL,
    `ServiceMinorVersion` int unsigned NOT NULL,
    `ServiceInstanceID`   int unsigned NOT NULL,
    `StoredValue`         VARCHAR(1024),
    UNIQUE (`Section_ID`, `StoredKey_ID`, `ServiceName_ID`, `ServiceMajorVersion`, `ServiceMinorVersion`, `ServiceInstanceID`)   
 )  ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

PRIMARY KEY は通常、常に主キーによって行にアクセスする場合に使用されるため、代わりに UNIQUE キーを使用してください。単なる制約の場合は、代わりに UNIQUE を使用してください。

于 2009-06-08T05:56:49.060 に答える
4

DB 構造設計に関する本を読む必要があります。そうすれば、そのような主キーを持つテーブルは作成されません。または、私が DB 構造を作成 (プロトタイプ) してくれる人を雇ってください。これは単なる友好的なアドバイスです。

于 2009-06-07T16:51:45.167 に答える
3

主キーに自動インクリメント整数を使用し、別の一意キーを追加します。

または、値として列binary(16)を使用して主キーとして使用してみることもできます。unhex(md5(concat()))

于 2009-06-07T13:27:59.450 に答える
2

データベースを理解せずに言うのは難しいですが、正規化が必要な場合があります。いつでもUNIQUE INDEX主キーではないを作成できます。一意になる単一の列がすでに存在する場合は、その主キーを作成し、存在しない場合は、代理の主キー(INTEGER AUTO_INCREMENT)を作成できます。

于 2009-06-07T13:30:23.253 に答える
0

@pornelと@CadeRouxがすでに投稿した内容に同意します。自動インクリメントされた整数列として代理主キー(ConfigurationId)を作成し、次に個別の一意のインデックスを作成することをお勧めします。

于 2009-06-07T13:35:38.157 に答える