Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据库表设计-使用长列作为主键是否存在任何问题?_Java_Sql_Database_Database Design_Derby - Fatal编程技术网

Java 数据库表设计-使用长列作为主键是否存在任何问题?

Java 数据库表设计-使用长列作为主键是否存在任何问题?,java,sql,database,database-design,derby,Java,Sql,Database,Database Design,Derby,请原谅我可能是一个愚蠢或明显的问题-我对数据库是新手 我计划从java将磁盘上媒体文件的文件路径链接存储在Derby数据库中,但我想知道设置表的最佳方法 只是澄清一下,我不打算在数据库中存储实际的媒体,只存储文件路径 该表将包含10k-100k行 我认为文件路径应该是主键,因为它唯一地标识每个媒体文件 设置带有文件路径的表并能够高效搜索(主要搜索文件名中的子字符串,但也搜索媒体属性)的最佳选项是什么 我计划使用VARCHAR(4096),因为最大linux路径长度是4096个字符 以这种方式创建

请原谅我可能是一个愚蠢或明显的问题-我对数据库是新手

我计划从java将磁盘上媒体文件的文件路径链接存储在Derby数据库中,但我想知道设置表的最佳方法

只是澄清一下,我不打算在数据库中存储实际的媒体,只存储文件路径

该表将包含10k-100k行

我认为文件路径应该是主键,因为它唯一地标识每个媒体文件

设置带有文件路径的表并能够高效搜索(主要搜索文件名中的子字符串,但也搜索媒体属性)的最佳选项是什么

我计划使用
VARCHAR(4096)
,因为最大linux路径长度是4096个字符

以这种方式创建一个表,在相当长的VARCHAR列上创建一个索引,有什么优点或缺点?你建议我如何设计这些桌子


谢谢

免责声明:这是一个非常个人的观点,可能很多人会不同意

你正在考虑使用“自然钥匙”,我反对使用。自然键是唯一标识它的对象的现有属性。。。直到它没有


这就像我的全名,我的身份证号码在我的国家。这些属性似乎是独一无二的,但问题是它们并不稳定。它们是可见的现有已知属性;这种可见性使它们容易受到更改的影响。这意味着,它们将随着时间而改变。如果我改名,我会是同一个人吗

此外,键通常用于与其他表进行某种程度的链接。一个大PK并不是很好。但这更像是一个实际问题


我建议您使用简单的INT或BIGINT作为主键,并向path属性添加唯一约束。这样,您的模型将更加灵活。如果将介质移动到另一个路径,则只需更新表中的单个值;如果路径是PK,那么您需要更新与之相关的所有外键。

免责声明:这是一个非常个人的观点,可能很多人会不同意

你正在考虑使用“自然钥匙”,我反对使用。自然键是唯一标识它的对象的现有属性。。。直到它没有


这就像我的全名,我的身份证号码在我的国家。这些属性似乎是独一无二的,但问题是它们并不稳定。它们是可见的现有已知属性;这种可见性使它们容易受到更改的影响。这意味着,它们将随着时间而改变。如果我改名,我会是同一个人吗

此外,键通常用于与其他表进行某种程度的链接。一个大PK并不是很好。但这更像是一个实际问题


我建议您使用简单的INT或BIGINT作为主键,并向path属性添加唯一约束。这样,您的模型将更加灵活。如果将介质移动到另一个路径,则只需更新表中的单个值;如果路径是PK,则需要更新与之相关的所有外键。

不要将长字符串用作主键

使用合成主键

以下是一些原因:

  • 主键的一个重要用途是支持外键。您不希望数据库中到处都是4k字符串,而您可以只使用一个4字节的整数
  • 主键的另一个重要原因是唯一地查找每一行。我认识的大多数人不希望必须键入4k字符才能识别行。我打字很快,这对我来说需要时间。我肯定我会在路上的某个地方打字
  • 两个字符串可能仅在2017字符上有所不同。我不想知道它们是不同的,特别是当字符是a
    1
    l
    O
    0

定义自动递增/标识/串行主键。您可以始终将URL声明为唯一的,这样它就不会重复(尽管某些数据库可能不允许在索引中使用这样长的键)。

不要将长字符串用作主键

使用合成主键

以下是一些原因:

  • 主键的一个重要用途是支持外键。您不希望数据库中到处都是4k字符串,而您可以只使用一个4字节的整数
  • 主键的另一个重要原因是唯一地查找每一行。我认识的大多数人不希望必须键入4k字符才能识别行。我打字很快,这对我来说需要时间。我肯定我会在路上的某个地方打字
  • 两个字符串可能仅在2017字符上有所不同。我不想知道它们是不同的,特别是当字符是a
    1
    l
    O
    0

定义自动递增/标识/串行主键。您可以始终将URL声明为
唯一
,这样它就不会重复(尽管某些数据库可能不允许在索引中使用如此长的键)。

非常感谢。对于我的媒体索引数据库,我会不时地重新扫描驱动器以查找新文件。每次要重新扫描时,必须在整个数据库中搜索每个文件的文件路径似乎效率低下,但我认为这是不可避免的。我应该做些什么来加快检查现有文件的速度?我想我只需要选择整个文件表并从中搜索内存,现在对于100k文件来说应该没有问题,但我想知道对于数百万或数十亿个文件来说什么是最佳做法。@localhost。你可以